chore: release packages#1989
Closed
github-actions[bot] wants to merge 1 commit into
Closed
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
github-actions
Bot
force-pushed
the
changeset-release/main
branch
2 times, most recently
from
June 25, 2026 04:42
28b5031 to
99a2bde
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
June 25, 2026 05:20
99a2bde to
d3a0812
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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@7.2.0
Minor Changes
e301475: feat(console): hide the AI surface at runtime when the server serves no AI agent (Community Edition)
A self-host Community Edition runtime (framework + this MIT console, without the
cloud
@objectstack/service-ai-studiopackage) serves noask/buildagent.The console now hides every AI entry point via runtime, server-pushed gating —
no build-time edition flag, no tree-shake.
Crucially, gating is driven off the agent catalog (
GET /api/v1/ai/agents),not the discovery
services.aiflag: the open-source framework keeps a headless@objectstack/service-aithat still reportsservices.aias available, so a CEruntime can report AI "available" while serving zero agents. The catalog is the
real "is there an agent to answer?" signal.
useAiSurfaceEnabled()hook +RequireAiSurfaceroute guard (exported)./ai*routes redirect to home when no agent is served; the FAB, top-bar AIlink and the metadata designers' "Ask AI" buttons hide;
AiChatPageshows agraceful "AI unavailable" state instead of an agent-less echo chat.
renders and works as before.
616157a: feat(studio): multi-hop relationship fields in the dataset designer (ADR-0071)
The dataset designer's field catalog and Included-relationships picker now
support multi-hop relationship paths (
account.owner.region), matching theframework's multi-hop join support (ADR-0071 P2):
useDatasetFieldCatalogwalks each included path hop-by-hop, fetching everyobject along the chain, so
path.fieldoptions surface for fields two–threeto-one hops deep (grouped under a chained
Account → Owner → Userheading).already-included path (drill
account→account.owner), capped at 3 hops.relationship path (
account.owner), with one-click "Add it".Single-hop datasets are unchanged.
41c60c4: Flow builder: variable data-picker for expression / template config fields. Expression and template surfaces (decision Branches, edge Condition, Assignment values, Screen description, CRUD field values / filter, subflow / script inputs) now show a "{x}" picker listing the references in scope at that node — flow variables, upstream node outputs, the trigger record's fields, and any enclosing loop item — resolved graph-aware by walking the flow back from the node. Selecting a reference inserts the correctly-braced token at the cursor (bare CEL in
expressionfields,{var}in template fields), handling the ADR-0032 brace-in-CEL trap for the author. Free-text typing is unchanged and an empty scope degrades to a plain input.Patch Changes
81ad9aa: feat(studio): package lifecycle UI — Duplicate base, Adopt loose items, structure-only delete (ADR-0070 D4/D5/D6)
PackageDetailSheetgains the user-facing affordances for the package-as-lifecycle-unit work:
POST /packages/:id/duplicate(clone a base into a newwritable package; D4).
POST /packages/:id/adopt-orphans(migrate everypackage-less orphan into this base; D5).
?keepData) — structure-onlyvs everything (D4 Q3).
D6 guardrail test: the scope selector never defaults to the package-less
Local / Customsentinel (writableBaseOptionsexcludes it; real bases sortfirst).
4b1cb7a: feat(studio): package-first create flow — prompt or redirect to a writable base (ADR-0070 D3)
Studio's create entry points no longer let a new metadata item land in a code
package or the package-less "Local / Custom" bucket. ResourceListPage's create
gate (
handleCreate) now: opens the create-base dialog when no writable baseexists; redirects into the first base when the active scope is Local/none but
bases exist; otherwise proceeds normally. Adds package-scope helpers
(
isLocalScope/writableBaseOptions) with tests, surfaces the kernel'swritable_package_required(422) as an actionable error in ResourceEditPage,and exports
CreatePackageDialogfrom PackagesPage for reuse.8a3b351: fix(console): gate the AI surface on the
service-aicapability (discovery), not the agent cataloguseAiSurfaceEnablednow keys off discovery'sservices.ai(isAiEnabled) —i.e. whether the enterprise
@objectstack/service-aicapability is present —instead of a non-empty agent catalog.
service-aiis an enterprise capability: a Community-Edition runtime doesn'tship it, so the framework doesn't register the AI service and discovery reports
services.aiunavailable → the whole AI surface hides. An install that hasservice-aireports it available → AI shows. The presence of the CAPABILITYgates, not whether a specific agent happens to be configured yet.
The earlier catalog-based gating was a workaround for the headless service
reporting itself available in CE; the framework now only registers the AI
service when the host app declares
@objectstack/service-ai(feat(cli): make the AI service opt-in via a declared dependency (Community-Edition support) framework#2311), so discovery is an honest edition signal and
the catalog detour is no longer needed. Everything else stays: the centralized
hook, the
RequireAiSurface/airoute guard, the gated top-bar link + designer"Ask AI" buttons, and AiChatPage's graceful empty state.
e575da0: fix(ai): stop the AI composer placeholder doubling to "Ask Ask…" for the Ask agent
The composer placeholder is
Ask {agent}…, which reads fine for most agents("Ask Build…") but doubles to "Ask Ask…" for the data-query agent whose label is
literally "Ask". The Ask agent now uses its purpose-built placeholder
(
console.ai.askAnything→ "Ask anything…", already localized) instead. Founddogfooding the AI Ask flow.
0d8dbda: fix(metadata-admin): dataset filter builder ignores incomplete conditions
groupToConditionemitted a condition for any row that had afield, even whenits value was still blank — producing a silently-wrong filter like
{ organization_id: { $eq: "" } }(matches only empty → excludes everything)instead of "no filter". Now rows with an empty/
undefined/[]value are skipped(value-less operators like is-empty / is-not-empty are still kept). Applies to both
the dataset Scope filter and per-measure filters. Found by dogfooding.
e8c1c85: fix(metadata-admin): re-base a dataset when its base object changes
A dataset's joins (
include), dimensions, measures, and filter all reference thebase object's fields. Changing the base object left those referencing the OLD
object — stale field refs that silently produce broken/ambiguous queries. Now a
real object change clears the object-dependent config (selecting the same object
is a no-op), and a heads-up note appears while there is config that a change would
clear. Found by dogfooding (G1).
0119ff4: Designer derives create defaults from the spec's create seed (/meta/types)
The metadata create flow now builds a new item's body from the server's authoritative
createSeed(delivered per type on the/meta/typesregistry entry — the single source of truth in@objectstack/spec) instead of the locally hardcodedcreateDefaults, falling back tocreateDefaultswhen the server provides no seed (older server, or canvas-create types). This closes the drift loop behind the "designer emits a minimal shape the spec rejects → create→save 422" family (dashboardlayout, actionbody): the structural create defaults now come from the same place the spec validates against, so they cannot diverge. Extracted as the pure, unit-testedbuildCreateModeBody.8e7c1da: fix(preview): draft-preview bar no longer demands a redundant Publish when nothing is pending
Under the auto-publish posture an AI build leaves zero pending drafts, yet opening a
draft preview still showed "Draft preview — Nothing here is live until you publish."
alongside "Changes (0)" and a Publish button — a self-contradicting, no-op call to
action.
DraftPreviewBarnow reflects the real pending-draft count: when it isknown to be zero the bar softens to a neutral preview indicator and drops the
Publish/Changes affordances; an unknown count (still loading / fetch failed) keeps
the publish path.
HomePage(count-gated) andRuntimeDraftBar(draft-gated)already behaved this way — this aligns the third surface.
522a54c: feat(studio): make the flow-canvas error banner clickable
The inline structural-error banner (ADR-0044 cycle surfacing) is now driven by
the unified
problemslist, and each row with a concrete target is clickable —clicking it selects and pans-to-reveal the offending node/edge (the same reveal
the Problems panel performs). So the always-visible banner is actionable without
opening the panel. Drops the now-redundant
validationErrorsstring prop: thebanner, the Problems panel, and the on-canvas badges all share one source.
cdc6246: Flow builder (Flow builder: variable data-picker (autocomplete) for expression / template fields #1934): expression problems — ADR-0032 brace/shape errors and scope-aware "unknown reference" warnings — now also surface in the flow Problems panel and as on-canvas node/edge badges (feat(studio): on-canvas validation badges + Problems panel for the flow builder #1972), not just inline in the inspector. A
{record.x}brace-in-CEL mistake or a typo'd variable is now visible at the flow level without opening each node. The start node's bare trigger-record fields are excluded from the ref check to avoid false positives (the inline inspector check still covers them).7fe2735: Flow builder data-picker (Flow builder: variable data-picker (autocomplete) for expression / template fields #1934): the cursor-insertion math is extracted into a pure
insertTokenhelper with unit tests (alongsideformatToken) — bare CEL vs{var}template insertion, append / mid-string / selection-replace, and clamping a reversed or out-of-range selection. Pure refactor, no behavior change.3f529a8: refactor(studio): derive the flow red-error highlight from the unified problem list (one validateFlowDraft pass)
Follow-up to feat(studio): on-canvas validation badges + Problems panel for the flow builder #1972 (Problems panel + badges) and feat(studio): make the flow-canvas error banner clickable (reveal on click) #1976 (clickable banner). The
flow preview still ran
validateFlowDrafttwice per render — once inbuildFlowProblems(badges / banner / panel) and again in a separate memo thatderived the red node/edge ring/stroke — with the cycle-highlight logic duplicated
between them.
buildFlowProblemsis now the single validation pass: a newderiveInvalidElements(problems)produces the red error set (errors only; acycle paints its whole loop via a per-problem
highlightset while its badge +reveal stay on the closing edge). The preview drops its second
validateFlowDraftcall. The clickable banner (feat(studio): make the flow-canvas error banner clickable (reveal on click) #1976), badges, and panel are unchanged — all four
surfaces now derive from one list, so they cannot drift.
0b9c96c: Flow builder data-picker follow-ups (Flow builder: variable data-picker (autocomplete) for expression / template fields #1934): (1) a scope-aware "unknown reference" warning pairs the picker with inline validation — a typed reference whose root isn't in scope at the node is flagged with a nearest-match "did you mean?" hint (conservative: root-only, skips function calls / string literals / runtime globals; non-blocking amber). (2) Assignment values authored in the array form
[{ variable, value }]now render in the key/value editor (and get the picker) instead of falling back to Advanced JSON; the editor reads both the object-map and array shapes and preserves whichever was authored. (3) A scriptcodebody (JS/TS, not a{var}template) now inserts bare references via arefModefield override —{x}is a syntax error in a script.47537fe: Flow builder data-picker (Flow builder: variable data-picker (autocomplete) for expression / template fields #1934): inline validation now also shows on the repeater surfaces that carry the picker — decision Branches expressions, screen field "visible when", and key/value values — not just single fields. Each shows the ADR-0032 brace error (red) or a scope-aware "unknown reference" warning (amber) via a shared
FlowExprIssueline. The trigger-record picker also offersprevious.<field>references on update / change / before-update triggers.17ba30d: feat(studio): on-canvas validation badges + a Problems panel for the flow builder
Flow validation only surfaced as a top banner ("…N error(s)") that didn't point
to the offending element — in a non-trivial flow you couldn't tell which node
or edge was wrong. The simulator's
validateFlowDraftalready detected thestructural problems (no resolvable entry, unreachable nodes, a decision with no
default branch, duplicate node ids, dangling edges, un-declared cycles); they
just weren't shown on the canvas. This was a surfacing gap, not a detection one.
The flow preview now:
issue message(s) as its tooltip;
_diagnosticsalready attached to the layered record); clicking a row selectsand reveals (pans to) the node/edge;
draft).
validateFlowDraftnow tags dangling-edge errors with their endpoints so theykey to the offending connection, and a new
flow-problemsmodule maps bothsources onto concrete canvas elements (node id / stable edge key). Server
diagnostics reach the preview through a new optional
diagnosticsprop onMetadataPreviewProps.104d181: fix(studio): flow wait-node inspector tolerates the loose
configshapeThe wait-node property form read only the spec-canonical
waitEventConfig.{eventType,signalName,…}, but the engine also accepts a looserconfig.{eventType,…}shape — which the canonicalshowcase_budget_approval(and AI-authored flows) use. So a showcase-shaped wait node opened in the
designer showed blank "Wait for" / "Signal name" fields.
Flow config fields gain an optional
fallbackPath: reads fall back to it (soloose-shape wait nodes display, and dependent fields reveal), writes target the
canonical path and prune the fallback (migrate-on-edit), and the fallback's
config key is suppressed from the Advanced block. The
waitfields now fallback to
config.*, so the designer matches the engine's tolerance. Pairs withthe ADR-0044 revise-loop authoring (feat(studio): author the approval revise loop in the flow designer (ADR-0044) #1954).
1fa5982: fix(studio): preview joined reports in the report editor (was "design blind")
Found dogfooding report design in Studio as a business user. The report editor's
live preview only rendered single dataset-bound reports — a
joinedreport(which carries its data on
blocks, with no top-leveldataset) fell through tothe "Bind a dataset to preview this report" empty state, so an author building a
joined report saw nothing and designed blind.
ReportPreviewnow renders a joined report (≥1 dataset-bound block) through thesame runtime
ReportRenderer(→DatasetReportRenderer, which already stacksthe blocks), keeping the preview pixel-equal with the runtime, and shows a
joined-aware empty state ("Add a block…") when no block is bound yet.
Updated dependencies [8e7c1da]
@object-ui/auth@7.2.0
Patch Changes
@object-ui/cli@7.2.0
Patch Changes
@object-ui/collaboration@7.2.0
Patch Changes
@object-ui/components@7.2.0
Patch Changes
@object-ui/core@7.2.0
Patch Changes
@object-ui/data-objectstack@7.2.0
Patch Changes
@object-ui/fields@7.2.0
Patch Changes
@object-ui/i18n@7.2.0
Patch Changes
8e7c1da: fix(preview): draft-preview bar no longer demands a redundant Publish when nothing is pending
Under the auto-publish posture an AI build leaves zero pending drafts, yet opening a
draft preview still showed "Draft preview — Nothing here is live until you publish."
alongside "Changes (0)" and a Publish button — a self-contradicting, no-op call to
action.
DraftPreviewBarnow reflects the real pending-draft count: when it isknown to be zero the bar softens to a neutral preview indicator and drops the
Publish/Changes affordances; an unknown count (still loading / fetch failed) keeps
the publish path.
HomePage(count-gated) andRuntimeDraftBar(draft-gated)already behaved this way — this aligns the third surface.
@object-ui/layout@7.2.0
Patch Changes
@object-ui/mobile@7.2.0
Patch Changes
@object-ui/permissions@7.2.0
Patch Changes
@object-ui/plugin-ai@7.2.0
Patch Changes
@object-ui/plugin-calendar@7.2.0
Patch Changes
@object-ui/plugin-charts@7.2.0
Patch Changes
@object-ui/plugin-chatbot@7.2.0
Patch Changes
@object-ui/plugin-dashboard@7.2.0
Patch Changes
@object-ui/plugin-designer@7.2.0
Patch Changes
@object-ui/plugin-detail@7.2.0
Patch Changes
@object-ui/plugin-editor@7.2.0
Patch Changes
@object-ui/plugin-form@7.2.0
Patch Changes
4aa8b84: fix(plugin-form): call
useRecordContextunconditionally; drop impure render-timeDate.now()LineItemsPanelwrappeduseRecordContext()in atry/catch, which ESLint flaggedas
react-hooks/rules-of-hooks("React Hook is called conditionally") — a genuinehook-order hazard if the
catchever fired part-way through render.useRecordContextreturns
nulloutside a<RecordContextProvider>and never throws, so the guard wasdead code; it's now called unconditionally at the top level and the
nullcase ishandled by the existing optional chaining.
Also clears a second pre-existing lint error:
EmbeddableFormnow seedsmountedAtReffrom
0instead of calling the impureDate.now()during render (the mount effectalready overwrites it before any submit, so the anti-bot min-fill check is unchanged),
fixing the react-compiler "Cannot call impure function during render" error. No
behavior change.
@object-ui/plugin-gantt@7.2.0
Patch Changes
@object-ui/plugin-grid@7.2.0
Patch Changes
0caea33: fix(grid): list column headers fall back to the field's label, not the prettified machine name
A view column declared as a bare
{ field: 'request_title' }(no explicitlabel) renderedits header from the prettified machine name ("Request title") even when the field had a
localized label ("申请标题"). On a non-English app that surfaced English column headers despite
fully-localized field labels. ObjectGrid now resolves the header as
column.label → schema field label → prettified name, matching the other header-resolutionsites in the same file. Found dogfooding AI-built Chinese apps.
Updated dependencies [8e7c1da]
@object-ui/plugin-kanban@7.2.0
Patch Changes
@object-ui/plugin-map@7.2.0
Patch Changes
@object-ui/plugin-markdown@7.2.0
Patch Changes
@object-ui/plugin-report@7.2.0
Patch Changes
@object-ui/plugin-timeline@7.2.0
Patch Changes
@object-ui/plugin-tree@7.2.0
Patch Changes
@object-ui/plugin-view@7.2.0
Patch Changes
@object-ui/providers@7.2.0
Patch Changes
@object-ui/react@7.2.0
Patch Changes
@object-ui/runner@7.2.0
Patch Changes
@object-ui/tenant@7.2.0
Patch Changes
@object-ui/console@7.2.0
@object-ui/create-plugin@7.2.0
@object-ui/plugin-list@7.2.0
@object-ui/types@7.2.0
object-ui@7.2.0
Patch Changes