chore: version packages#2785
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
from
July 10, 2026 11:49
3370fb6 to
fc26f56
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
July 10, 2026 11:58
fc26f56 to
a35a09b
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
July 10, 2026 12:07
a35a09b to
e366d0a
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
@objectstack/spec@15.0.0
Major Changes
02f6af4: ADR-0090 follow-through wave: enforce book audience at the read layer; finish the D2/D3 cleanup the P1 rename missed.
/meta/book,/meta/doc, and/meta/book/:name/treenow ENFORCEthe ADR-0046 §6.7 audience model (ADR-0049 — no unenforced security
properties): anonymous callers see only
publicbooks/docs;{ permissionSet }-gated books require the caller to hold the named set;a doc's effective audience is the union over the books that CLAIM it
(unclaimed docs default to
org; orphan rendering never inheritspublic).Gated evaluation fails CLOSED when holdings cannot be resolved.
doc/booksingle-item reads bypass the shared meta cache (per-caller gate vs shared ETag).
audienceAllows,resolveDocAudiences,docAudienceAllows,resolveBookClaimedDocs(+
AudienceCaller/AudienceBooktypes). BREAKING (launch window):METADATA_FORM_REGISTRYkeysrole/profileare gone —positionis theregistered form (the
positiontype had LOST its form layout in the P1rename);
EnvironmentArtifactMetadataSchemadeclarespositionsinstead ofretired
roles/profiles.securityservice exposesresolvePermissionSetNames(ctx)— the same resolution as data-planeenforcement, for the docs gate.
positions → 'position'(the staleroles → 'role'mapping matched nothing since the P1 rename, silentlydropping compiled positions from metadata registration).
audienceis apermission-model reference now), and a new advisory rule
security-book-audience-unknown-setflags a{ permissionSet }audiencenaming a set the stack does not declare (runtime fails closed — the typo
cost is "nobody can read the book", so say it at author time).
position(all fourlocales) and drop the retired
role/profilegroups, with a vocabularyregression test.
Minor Changes
2a71f48: feat(auth): admin direct user management, phone sign-in, and identity bulk import (feat(auth): 管理员直建用户 + 手机号登录 + sys_user 批量导入 —— 分阶段实施(#2758 重排) #2766, re-scoped feat(auth): sys_user 批量导入接口 —— 导入用户的密码处理策略 #2758)
sys_useris managed by better-auth and its generic CRUD is suppressed, sountil now the only way to add a teammate was the email-dependent invite flow.
This ships three staged capabilities:
POST /api/v1/auth/admin/create-userand a wrapped
POST /api/v1/auth/admin/set-user-password(ADR-0068platform-admin gate; better-auth pipeline so credentials are real). Optional
generated temporary password (returned once, never persisted or logged) and
a new
sys_user.must_change_passwordflag enforced through the ADR-0069authGate (
403 PASSWORD_EXPIREDuntil the user changes it). Newcreate_useraction and upgradedset_user_passwordaction on the Userslist — pure schema, no frontend changes.
auth.plugins.phoneNumber) — better-authphoneNumber plugin, phone+password only (
POST /sign-in/phone-number);OTP flows stay off until SMS infrastructure exists. Adds
sys_user.phone_number(unique) /phone_number_verified. Phone-onlyaccounts get an undeliverable placeholder email
(
u-<random>@placeholder.invalid, never derived from the phone number);all auth mail callbacks refuse placeholder recipients.
POST /api/v1/auth/admin/import-usersacceptsthe same payloads as the generic import routes (rows/csv/xlsx, dryRun,
upsert by email or phone) but writes every row through better-auth.
Password policies:
invite(reset-link email per created user; requires anEmailService) and
temporary(per-row one-time passwords + forced change).Sync only, ≤500 rows per request; no undo; upsert updates touch profile
fields only and can never reset an existing user's password.
prepareImportRequestand the CSV/xlsx parsers moved from rest-server.tsto an exported
import-prepare.tsmodule (behavior unchanged).@objectstack/cli@15.0.0
Minor Changes
8f0b9df: fix(cli,plugin-security):
os meta resyncto re-materialize default permission sets from dist ([cli/plugin-security] dev 元数据物化不一致:默认权限集 insert-if-not-exists 不重物化(声明集走 upsert) #2705)The default permission sets (
admin_full_access/member_default/viewer_readonly…) were seeded insert-once at boot:bootstrapPlatformAdminskipped any row that already existed and never wrote the shipped declaration
back. So editing a default set's source, recompiling, and restarting
os devwithout
--freshleft the runtime serving the OLD value — silently, becausethe runtime authz resolver hydrates permission sets from the
sys_permission_setrow (
resolve-authz-context.ts), not from the in-memory dist. A permission-gatedsurface (e.g.
setup.access) would keep its stale behavior with no error, whichrepeatedly misled debugging. Every other metadata seed (declared permission
sets, positions, built-in roles, capabilities) already upserts on boot, leaving
the platform-default path the lone insert-once holdout — a gap ADR-0090 widened
by persisting more facets (
system_permissions, delegated-adminadmin_scope)onto the same row.
The insert-once posture is deliberate for prod (it protects an admin's Setup
edits and keeps the defaults env-authored — the exact posture
bootstrapDeclaredPermissionsrelies on), so this is not switched to a blindupsert. Instead:
bootstrapPlatformAdmingains aresyncoption. Default boot behavior isunchanged (insert-once). Under
resync, an existing row is reconciled to theshipped dist only when the platform still owns it (
managed_byabsent or'platform'); a row an admin took over (managed_by:'user') or a package owns(
'package') is an intentional override and is left untouched.os meta resynccommand boots the runtime, reconciles the defaultpermission-set rows to the compiled dist, and reports what was reconciled /
preserved / newly seeded — without touching business data and without a
--freshwipe. Gated behind a confirmation prompt (--yesto skip;--jsonfor scripting).
Prod boot is unaffected; the fix is entirely opt-in via the new command.
Patch Changes
@objectstack/lint@15.0.0
Minor Changes
02f6af4: ADR-0090 follow-through wave: enforce book audience at the read layer; finish the D2/D3 cleanup the P1 rename missed.
/meta/book,/meta/doc, and/meta/book/:name/treenow ENFORCEthe ADR-0046 §6.7 audience model (ADR-0049 — no unenforced security
properties): anonymous callers see only
publicbooks/docs;{ permissionSet }-gated books require the caller to hold the named set;a doc's effective audience is the union over the books that CLAIM it
(unclaimed docs default to
org; orphan rendering never inheritspublic).Gated evaluation fails CLOSED when holdings cannot be resolved.
doc/booksingle-item reads bypass the shared meta cache (per-caller gate vs shared ETag).
audienceAllows,resolveDocAudiences,docAudienceAllows,resolveBookClaimedDocs(+
AudienceCaller/AudienceBooktypes). BREAKING (launch window):METADATA_FORM_REGISTRYkeysrole/profileare gone —positionis theregistered form (the
positiontype had LOST its form layout in the P1rename);
EnvironmentArtifactMetadataSchemadeclarespositionsinstead ofretired
roles/profiles.securityservice exposesresolvePermissionSetNames(ctx)— the same resolution as data-planeenforcement, for the docs gate.
positions → 'position'(the staleroles → 'role'mapping matched nothing since the P1 rename, silentlydropping compiled positions from metadata registration).
audienceis apermission-model reference now), and a new advisory rule
security-book-audience-unknown-setflags a{ permissionSet }audiencenaming a set the stack does not declare (runtime fails closed — the typo
cost is "nobody can read the book", so say it at author time).
position(all fourlocales) and drop the retired
role/profilegroups, with a vocabularyregression test.
Patch Changes
@objectstack/metadata@15.0.0
Minor Changes
02f6af4: ADR-0090 follow-through wave: enforce book audience at the read layer; finish the D2/D3 cleanup the P1 rename missed.
/meta/book,/meta/doc, and/meta/book/:name/treenow ENFORCEthe ADR-0046 §6.7 audience model (ADR-0049 — no unenforced security
properties): anonymous callers see only
publicbooks/docs;{ permissionSet }-gated books require the caller to hold the named set;a doc's effective audience is the union over the books that CLAIM it
(unclaimed docs default to
org; orphan rendering never inheritspublic).Gated evaluation fails CLOSED when holdings cannot be resolved.
doc/booksingle-item reads bypass the shared meta cache (per-caller gate vs shared ETag).
audienceAllows,resolveDocAudiences,docAudienceAllows,resolveBookClaimedDocs(+
AudienceCaller/AudienceBooktypes). BREAKING (launch window):METADATA_FORM_REGISTRYkeysrole/profileare gone —positionis theregistered form (the
positiontype had LOST its form layout in the P1rename);
EnvironmentArtifactMetadataSchemadeclarespositionsinstead ofretired
roles/profiles.securityservice exposesresolvePermissionSetNames(ctx)— the same resolution as data-planeenforcement, for the docs gate.
positions → 'position'(the staleroles → 'role'mapping matched nothing since the P1 rename, silentlydropping compiled positions from metadata registration).
audienceis apermission-model reference now), and a new advisory rule
security-book-audience-unknown-setflags a{ permissionSet }audiencenaming a set the stack does not declare (runtime fails closed — the typo
cost is "nobody can read the book", so say it at author time).
position(all fourlocales) and drop the retired
role/profilegroups, with a vocabularyregression test.
Patch Changes
@objectstack/platform-objects@15.0.0
Minor Changes
2a71f48: feat(auth): admin direct user management, phone sign-in, and identity bulk import (feat(auth): 管理员直建用户 + 手机号登录 + sys_user 批量导入 —— 分阶段实施(#2758 重排) #2766, re-scoped feat(auth): sys_user 批量导入接口 —— 导入用户的密码处理策略 #2758)
sys_useris managed by better-auth and its generic CRUD is suppressed, sountil now the only way to add a teammate was the email-dependent invite flow.
This ships three staged capabilities:
POST /api/v1/auth/admin/create-userand a wrapped
POST /api/v1/auth/admin/set-user-password(ADR-0068platform-admin gate; better-auth pipeline so credentials are real). Optional
generated temporary password (returned once, never persisted or logged) and
a new
sys_user.must_change_passwordflag enforced through the ADR-0069authGate (
403 PASSWORD_EXPIREDuntil the user changes it). Newcreate_useraction and upgradedset_user_passwordaction on the Userslist — pure schema, no frontend changes.
auth.plugins.phoneNumber) — better-authphoneNumber plugin, phone+password only (
POST /sign-in/phone-number);OTP flows stay off until SMS infrastructure exists. Adds
sys_user.phone_number(unique) /phone_number_verified. Phone-onlyaccounts get an undeliverable placeholder email
(
u-<random>@placeholder.invalid, never derived from the phone number);all auth mail callbacks refuse placeholder recipients.
POST /api/v1/auth/admin/import-usersacceptsthe same payloads as the generic import routes (rows/csv/xlsx, dryRun,
upsert by email or phone) but writes every row through better-auth.
Password policies:
invite(reset-link email per created user; requires anEmailService) and
temporary(per-row one-time passwords + forced change).Sync only, ≤500 rows per request; no undo; upsert updates touch profile
fields only and can never reset an existing user's password.
prepareImportRequestand the CSV/xlsx parsers moved from rest-server.tsto an exported
import-prepare.tsmodule (behavior unchanged).Patch Changes
02f6af4: ADR-0090 follow-through wave: enforce book audience at the read layer; finish the D2/D3 cleanup the P1 rename missed.
/meta/book,/meta/doc, and/meta/book/:name/treenow ENFORCEthe ADR-0046 §6.7 audience model (ADR-0049 — no unenforced security
properties): anonymous callers see only
publicbooks/docs;{ permissionSet }-gated books require the caller to hold the named set;a doc's effective audience is the union over the books that CLAIM it
(unclaimed docs default to
org; orphan rendering never inheritspublic).Gated evaluation fails CLOSED when holdings cannot be resolved.
doc/booksingle-item reads bypass the shared meta cache (per-caller gate vs shared ETag).
audienceAllows,resolveDocAudiences,docAudienceAllows,resolveBookClaimedDocs(+
AudienceCaller/AudienceBooktypes). BREAKING (launch window):METADATA_FORM_REGISTRYkeysrole/profileare gone —positionis theregistered form (the
positiontype had LOST its form layout in the P1rename);
EnvironmentArtifactMetadataSchemadeclarespositionsinstead ofretired
roles/profiles.securityservice exposesresolvePermissionSetNames(ctx)— the same resolution as data-planeenforcement, for the docs gate.
positions → 'position'(the staleroles → 'role'mapping matched nothing since the P1 rename, silentlydropping compiled positions from metadata registration).
audienceis apermission-model reference now), and a new advisory rule
security-book-audience-unknown-setflags a{ permissionSet }audiencenaming a set the stack does not declare (runtime fails closed — the typo
cost is "nobody can read the book", so say it at author time).
position(all fourlocales) and drop the retired
role/profilegroups, with a vocabularyregression test.
Updated dependencies [2a71f48]
Updated dependencies [02f6af4]
@objectstack/plugin-auth@15.0.0
Minor Changes
2a71f48: feat(auth): admin direct user management, phone sign-in, and identity bulk import (feat(auth): 管理员直建用户 + 手机号登录 + sys_user 批量导入 —— 分阶段实施(#2758 重排) #2766, re-scoped feat(auth): sys_user 批量导入接口 —— 导入用户的密码处理策略 #2758)
sys_useris managed by better-auth and its generic CRUD is suppressed, sountil now the only way to add a teammate was the email-dependent invite flow.
This ships three staged capabilities:
POST /api/v1/auth/admin/create-userand a wrapped
POST /api/v1/auth/admin/set-user-password(ADR-0068platform-admin gate; better-auth pipeline so credentials are real). Optional
generated temporary password (returned once, never persisted or logged) and
a new
sys_user.must_change_passwordflag enforced through the ADR-0069authGate (
403 PASSWORD_EXPIREDuntil the user changes it). Newcreate_useraction and upgradedset_user_passwordaction on the Userslist — pure schema, no frontend changes.
auth.plugins.phoneNumber) — better-authphoneNumber plugin, phone+password only (
POST /sign-in/phone-number);OTP flows stay off until SMS infrastructure exists. Adds
sys_user.phone_number(unique) /phone_number_verified. Phone-onlyaccounts get an undeliverable placeholder email
(
u-<random>@placeholder.invalid, never derived from the phone number);all auth mail callbacks refuse placeholder recipients.
POST /api/v1/auth/admin/import-usersacceptsthe same payloads as the generic import routes (rows/csv/xlsx, dryRun,
upsert by email or phone) but writes every row through better-auth.
Password policies:
invite(reset-link email per created user; requires anEmailService) and
temporary(per-row one-time passwords + forced change).Sync only, ≤500 rows per request; no undo; upsert updates touch profile
fields only and can never reset an existing user's password.
prepareImportRequestand the CSV/xlsx parsers moved from rest-server.tsto an exported
import-prepare.tsmodule (behavior unchanged).Patch Changes
@objectstack/plugin-security@15.0.0
Minor Changes
02f6af4: ADR-0090 follow-through wave: enforce book audience at the read layer; finish the D2/D3 cleanup the P1 rename missed.
/meta/book,/meta/doc, and/meta/book/:name/treenow ENFORCEthe ADR-0046 §6.7 audience model (ADR-0049 — no unenforced security
properties): anonymous callers see only
publicbooks/docs;{ permissionSet }-gated books require the caller to hold the named set;a doc's effective audience is the union over the books that CLAIM it
(unclaimed docs default to
org; orphan rendering never inheritspublic).Gated evaluation fails CLOSED when holdings cannot be resolved.
doc/booksingle-item reads bypass the shared meta cache (per-caller gate vs shared ETag).
audienceAllows,resolveDocAudiences,docAudienceAllows,resolveBookClaimedDocs(+
AudienceCaller/AudienceBooktypes). BREAKING (launch window):METADATA_FORM_REGISTRYkeysrole/profileare gone —positionis theregistered form (the
positiontype had LOST its form layout in the P1rename);
EnvironmentArtifactMetadataSchemadeclarespositionsinstead ofretired
roles/profiles.securityservice exposesresolvePermissionSetNames(ctx)— the same resolution as data-planeenforcement, for the docs gate.
positions → 'position'(the staleroles → 'role'mapping matched nothing since the P1 rename, silentlydropping compiled positions from metadata registration).
audienceis apermission-model reference now), and a new advisory rule
security-book-audience-unknown-setflags a{ permissionSet }audiencenaming a set the stack does not declare (runtime fails closed — the typo
cost is "nobody can read the book", so say it at author time).
position(all fourlocales) and drop the retired
role/profilegroups, with a vocabularyregression test.
8f0b9df: fix(cli,plugin-security):
os meta resyncto re-materialize default permission sets from dist ([cli/plugin-security] dev 元数据物化不一致:默认权限集 insert-if-not-exists 不重物化(声明集走 upsert) #2705)The default permission sets (
admin_full_access/member_default/viewer_readonly…) were seeded insert-once at boot:bootstrapPlatformAdminskipped any row that already existed and never wrote the shipped declaration
back. So editing a default set's source, recompiling, and restarting
os devwithout
--freshleft the runtime serving the OLD value — silently, becausethe runtime authz resolver hydrates permission sets from the
sys_permission_setrow (
resolve-authz-context.ts), not from the in-memory dist. A permission-gatedsurface (e.g.
setup.access) would keep its stale behavior with no error, whichrepeatedly misled debugging. Every other metadata seed (declared permission
sets, positions, built-in roles, capabilities) already upserts on boot, leaving
the platform-default path the lone insert-once holdout — a gap ADR-0090 widened
by persisting more facets (
system_permissions, delegated-adminadmin_scope)onto the same row.
The insert-once posture is deliberate for prod (it protects an admin's Setup
edits and keeps the defaults env-authored — the exact posture
bootstrapDeclaredPermissionsrelies on), so this is not switched to a blindupsert. Instead:
bootstrapPlatformAdmingains aresyncoption. Default boot behavior isunchanged (insert-once). Under
resync, an existing row is reconciled to theshipped dist only when the platform still owns it (
managed_byabsent or'platform'); a row an admin took over (managed_by:'user') or a package owns(
'package') is an intentional override and is left untouched.os meta resynccommand boots the runtime, reconciles the defaultpermission-set rows to the compiled dist, and reports what was reconciled /
preserved / newly seeded — without touching business data and without a
--freshwipe. Gated behind a confirmation prompt (--yesto skip;--jsonfor scripting).
Prod boot is unaffected; the fix is entirely opt-in via the new command.
Patch Changes
@objectstack/rest@15.0.0
Minor Changes
2a71f48: feat(auth): admin direct user management, phone sign-in, and identity bulk import (feat(auth): 管理员直建用户 + 手机号登录 + sys_user 批量导入 —— 分阶段实施(#2758 重排) #2766, re-scoped feat(auth): sys_user 批量导入接口 —— 导入用户的密码处理策略 #2758)
sys_useris managed by better-auth and its generic CRUD is suppressed, sountil now the only way to add a teammate was the email-dependent invite flow.
This ships three staged capabilities:
POST /api/v1/auth/admin/create-userand a wrapped
POST /api/v1/auth/admin/set-user-password(ADR-0068platform-admin gate; better-auth pipeline so credentials are real). Optional
generated temporary password (returned once, never persisted or logged) and
a new
sys_user.must_change_passwordflag enforced through the ADR-0069authGate (
403 PASSWORD_EXPIREDuntil the user changes it). Newcreate_useraction and upgradedset_user_passwordaction on the Userslist — pure schema, no frontend changes.
auth.plugins.phoneNumber) — better-authphoneNumber plugin, phone+password only (
POST /sign-in/phone-number);OTP flows stay off until SMS infrastructure exists. Adds
sys_user.phone_number(unique) /phone_number_verified. Phone-onlyaccounts get an undeliverable placeholder email
(
u-<random>@placeholder.invalid, never derived from the phone number);all auth mail callbacks refuse placeholder recipients.
POST /api/v1/auth/admin/import-usersacceptsthe same payloads as the generic import routes (rows/csv/xlsx, dryRun,
upsert by email or phone) but writes every row through better-auth.
Password policies:
invite(reset-link email per created user; requires anEmailService) and
temporary(per-row one-time passwords + forced change).Sync only, ≤500 rows per request; no undo; upsert updates touch profile
fields only and can never reset an existing user's password.
prepareImportRequestand the CSV/xlsx parsers moved from rest-server.tsto an exported
import-prepare.tsmodule (behavior unchanged).02f6af4: ADR-0090 follow-through wave: enforce book audience at the read layer; finish the D2/D3 cleanup the P1 rename missed.
/meta/book,/meta/doc, and/meta/book/:name/treenow ENFORCEthe ADR-0046 §6.7 audience model (ADR-0049 — no unenforced security
properties): anonymous callers see only
publicbooks/docs;{ permissionSet }-gated books require the caller to hold the named set;a doc's effective audience is the union over the books that CLAIM it
(unclaimed docs default to
org; orphan rendering never inheritspublic).Gated evaluation fails CLOSED when holdings cannot be resolved.
doc/booksingle-item reads bypass the shared meta cache (per-caller gate vs shared ETag).
audienceAllows,resolveDocAudiences,docAudienceAllows,resolveBookClaimedDocs(+
AudienceCaller/AudienceBooktypes). BREAKING (launch window):METADATA_FORM_REGISTRYkeysrole/profileare gone —positionis theregistered form (the
positiontype had LOST its form layout in the P1rename);
EnvironmentArtifactMetadataSchemadeclarespositionsinstead ofretired
roles/profiles.securityservice exposesresolvePermissionSetNames(ctx)— the same resolution as data-planeenforcement, for the docs gate.
positions → 'position'(the staleroles → 'role'mapping matched nothing since the P1 rename, silentlydropping compiled positions from metadata registration).
audienceis apermission-model reference now), and a new advisory rule
security-book-audience-unknown-setflags a{ permissionSet }audiencenaming a set the stack does not declare (runtime fails closed — the typo
cost is "nobody can read the book", so say it at author time).
position(all fourlocales) and drop the retired
role/profilegroups, with a vocabularyregression test.
bea4b92: feat(rest): colour select/radio cells in xlsx exports with their option colour
The data export route (
GET /data/:object/export) now carries a select /radio field's option
colorinto the generated Excel workbook as the cell'sfont colour (white cell background), so an exported sheet reads like the
in-app coloured badges instead of plain black text. csv / json output is
unchanged.
export-format.tsgainstoArgb()(hex#RGB/#RRGGBB→ exceljs ARGBFFRRGGBB,undefinedfor anything not plain hex) andcellFontColor()(resolves the matched select/radio option's colour for one cell; returns
undefined— i.e. leave it unstyled — for non-option fields, unmatchedvalues, colourless options, or invalid hex).
ExportFieldMeta.optionsnowcarries the option
color.createXlsxStream(res, useStyles)takes the flag through to exceljs'WorkbookWriter; the route enables styling and setscell.font.colorper-cell only for xlsx.
Styling is heavier than a bare value dump, so it is gated behind a 10 000-row
cap (
STYLE_ROW_CAP): exports whose effective limit exceeds it streamwithout colours (all rows intact) and set
X-Export-Styles: dropped; colouredexports set
X-Export-Styles: applied. This mirrors the "formatted export has alower ceiling than a raw dump" pattern used by Salesforce / ServiceNow. The
existing 50 000-row hard cap is unchanged.
Closes Excel 导出支持 select/status 字段颜色(白底+选项色作字体色) #2757.
Patch Changes
@objectstack/hono@15.0.0
Patch Changes
@objectstack/account@15.0.0
Patch Changes
@objectstack/setup@15.0.0
Patch Changes
@objectstack/studio@15.0.0
Patch Changes
@objectstack/client@15.0.0
Patch Changes
@objectstack/client-react@15.0.0
Patch Changes
@objectstack/cloud-connection@15.0.0
Patch Changes
@objectstack/connector-mcp@15.0.0
Patch Changes
@objectstack/connector-openapi@15.0.0
Patch Changes
@objectstack/connector-rest@15.0.0
Patch Changes
@objectstack/connector-slack@15.0.0
Patch Changes
@objectstack/core@15.0.0
Patch Changes
@objectstack/formula@15.0.0
Patch Changes
@objectstack/mcp@15.0.0
Patch Changes
@objectstack/metadata-core@15.0.0
Patch Changes
@objectstack/metadata-fs@15.0.0
Patch Changes
@objectstack/metadata-protocol@15.0.0
Patch Changes
@objectstack/objectql@15.0.0
Patch Changes
ff648ad: fix(data): resolve field
defaultValues BEFORE thebeforeInserthook ([objectql] 字段 defaultValue 解析晚于 beforeInsert hook,派生字段 hook 读到 null #2703)Declarative field defaults (including the
current_usertoken) were resolvedby
applyFieldDefaultsafter the userbeforeInserthook ran. A hook thatDERIVED one field from another therefore read a stale
nullfor any field thatwas about to be defaulted — e.g.
sales_person: Field.user({ defaultValue: 'current_user' })leftsales_person == nullinside the hook, so a derivedcurrent_statuscomputed tounassignedunless the client passed the fieldexplicitly.
applyFieldDefaultsnow runs at record-initialization time, beforebeforeInsert, matching the industry-standard order of execution (Salesforcefield defaults / ServiceNow dictionary defaults are populated before before-
triggers; engine-owned generation — autonumber sequences, encryption, timestamps
— stays after the hook). The hook still has final say: it runs after and may
override any defaulted field. Defaults still only fill fields left
undefined,so client-supplied values are untouched, and the caller's input object is no
longer mutated in place.
Behavior note: a
beforeInserthook can no longer distinguish "client omittedfield X" from "field X received its default" for fields that declare a
defaultValue— the hook now always sees the resolved default. This matches howSalesforce/ServiceNow behave (before logic sees a fully-initialized record) and
is the intended fix.
Updated dependencies [2a71f48]
Updated dependencies [02f6af4]
@objectstack/observability@15.0.0
Patch Changes
@objectstack/driver-memory@15.0.0
Patch Changes
@objectstack/driver-mongodb@15.0.0
Patch Changes
@objectstack/driver-sql@15.0.0
Patch Changes
@objectstack/driver-sqlite-wasm@15.0.0
Patch Changes
@objectstack/embedder-openai@15.0.0
Patch Changes
@objectstack/knowledge-memory@15.0.0
Patch Changes
@objectstack/knowledge-ragflow@15.0.0
Patch Changes
@objectstack/plugin-approvals@15.0.0
Patch Changes
@objectstack/plugin-audit@15.0.0
Patch Changes
@objectstack/plugin-dev@15.0.0
Patch Changes
@objectstack/plugin-email@15.0.0
Patch Changes
@objectstack/plugin-hono-server@15.0.0
Patch Changes
@objectstack/plugin-reports@15.0.0
Patch Changes
@objectstack/plugin-sharing@15.0.0
Patch Changes
@objectstack/plugin-webhooks@15.0.0
Patch Changes
@objectstack/runtime@15.0.0
Patch Changes
@objectstack/service-analytics@15.0.0
Patch Changes
@objectstack/service-automation@15.0.0
Patch Changes
@objectstack/service-cache@15.0.0
Patch Changes
@objectstack/service-cluster@15.0.0
Patch Changes
@objectstack/service-cluster-redis@15.0.0
Patch Changes
@objectstack/service-datasource@15.0.0
Patch Changes
@objectstack/service-i18n@15.0.0
Patch Changes
@objectstack/service-job@15.0.0
Patch Changes
@objectstack/service-knowledge@15.0.0
Patch Changes
@objectstack/service-messaging@15.0.0
Patch Changes
@objectstack/service-package@15.0.0
Patch Changes
@objectstack/service-queue@15.0.0
Patch Changes
@objectstack/service-realtime@15.0.0
Patch Changes
@objectstack/service-settings@15.0.0
Patch Changes
@objectstack/service-storage@15.0.0
Patch Changes
@objectstack/trigger-api@15.0.0
Patch Changes
@objectstack/trigger-record-change@15.0.0
Patch Changes
@objectstack/trigger-schedule@15.0.0
Patch Changes
@objectstack/types@15.0.0
Patch Changes
@objectstack/verify@15.0.0
Patch Changes
@objectstack/console@15.0.0
create-objectstack@15.0.0
@objectstack/sdui-parser@15.0.0
objectstack-vscode@15.0.0
@objectstack/example-crm@4.0.81
Patch Changes
@objectstack/example-showcase@0.3.3
Patch Changes
@objectstack/example-todo@4.0.81
Patch Changes
@objectstack/example-embed-objectql@0.0.21
Patch Changes
@objectstack/dogfood@0.0.29
Patch Changes
@objectstack/downstream-contract@0.0.27
Patch Changes