chore: version packages#2895
Merged
Merged
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
000ff13 to
2a75517
Compare
2a75517 to
e0a0126
Compare
e0a0126 to
32b3d81
Compare
32b3d81 to
c8b1370
Compare
c8b1370 to
7cc5a29
Compare
7cc5a29 to
c7c3c8b
Compare
c7c3c8b to
870d33f
Compare
870d33f to
ca387da
Compare
ca387da to
d8615b8
Compare
d8615b8 to
6ca3059
Compare
6ca3059 to
b87fb6b
Compare
b87fb6b to
5d449c9
Compare
2a98d9a to
86f5d8d
Compare
86f5d8d to
52121a9
Compare
52121a9 to
0de5347
Compare
0de5347 to
14d3ee9
Compare
14d3ee9 to
37b1ae5
Compare
37b1ae5 to
7e8096d
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/cli@14.8.0
Minor Changes
16b4bf6: ADR-0087 P2:可重放迁移链 + 机器可读变更清单(D3 / D4)。
D3 —— 迁移链(
@objectstack/spec新增migrations/)。 一条永久、有序、按协议大版本组织的迁移链。每个大版本的步骤由两个来源合成:已毕业的转换(P1 的 D2 转换条目从加载路径退役后,以其 id 引用复用,作为该大版本的“机械变换”,转换与 fixture 不重复)和语义变更(无损映射无法表达的破坏,以结构化 TODO —— surface / 原因 / 验收标准 —— 呈现,而非静默或有损自动改写)。applyMetaMigrations(stack, fromMajor, toMajor?)折叠fromMajor+1 … 当前的步骤,一次性把任意历史大版本的元数据迁到当前;跨大版本是设计主场景。每一跳(hop)都做检查点,便于逐跳验证与二分定位。时效性从不承重 —— 迟到的使用方到达时重放链即可。composeMigrationChain、MigrationFloorError,以及显式的发布策略旋钮MIGRATION_SUPPORT_FLOOR(链能回溯到多久)。titleFormat复合模板 →nameField(需公式字段,非无损)、SQL 式 RLS 谓词 → 规范 CEL。D4 ——
spec-changes.json变更清单。 Zod 定义的机器可读记录{ from, to, added, converted, migrated, removed },由composeSpecChanges(from, to, surfaceDiff?)跨大版本折叠转换表(D2)与迁移集(D3),并与发布期 api-surface 差异连接。按大版本的清单可组合成单一from→to视图;后续生成式升级指南与 P3 的 MCPspec_changes工具都是它的投影。CLI ——
objectstack migrate meta --from N。 重放迁移链:展示生成的、经ObjectStackDefinitionSchema校验的机械变更 diff(逐条path: 旧 → 新)与需人工判断的语义 TODO;--to、--step(逐跳检查点)、--out <file.json>(把规范化后的栈写为可 diff 的 JSON 快照)、--json。命令不静默改写 TS 配置源(AST 改写不安全且有损)—— 输出供使用方 agent 审阅采纳,这正是握手错误(P0)所指向的命令。normalizeStackInput新增可选convert: false(仅做 map→array,不跑 D2 转换),供migrate meta对原始编写源重放链、把每处改写归因到对应链步。新增导出纯增量,无破坏性移除。10e8983: ADR-0089 D3b: add the
validateVisibilityPredicateslint rule for conditional-visibility keys, wired intoos validateandos compileas advisory warnings.Two rules, both
warning(never fail the build):visibility-alias-deprecated— avisibleOn(view form section/field) orvisibility(page component) key in authored source. It still works — the schema normalizes it tovisibleWhenat parse — but the canonical key isvisibleWhen. Fix: rename the key (same CEL value).visibility-root-mislayered— a runtime view/page visibility predicate rooted atdata.(the metadata-editing-form root). Runtime record surfaces bindrecord+current_user(pages also exposepage.<var>), so adata.-rooted predicate here never matches and the element renders unconditionally. Fix: userecord./page..The rule runs on the pre-parse stack (like
validate-list-view-mode) so it can see the deprecated alias the author actually wrote before the schema folds it intovisibleWhen.5540ced: feat(cli): surface the migration guide when an app's specVersion trails the installed platform
os validate,os build/os compile, andos doctornow emit a non-blockingadvisory when the app's authored
manifest.specVersiondeclares an OLDER majorthan the
@objectstack/specactually installed in itsnode_modules— pointingat the curated per-major migration guide (
https://docs.objectstack.ai/docs/releases/v<major>,guaranteed to exist by
scripts/check-release-notes.mjs).This closes a discoverability gap for downstream/third-party apps: on a platform
upgrade the release notes were only reachable by reverse-engineering per-package
CHANGELOG.mdfiles. The advisory now surfaces the guide at the exact moment theupgrade is exercised. It never fails a build/validate and is not gated by
--strict; it also appears in the--jsonoutput asspecVersionGap. Logiclives in a new shared
checkSpecVersionGap()util (unit-tested; installedversion injectable for tests).
bb71321: i18n: translate the system account/messaging surfaces end to end.
ObjectTranslationDataSchema/ObjectTranslationNodeSchemanowaccept
_views.<view>.emptyState.{title,message}so list-view empty statesare translatable (contract-first for the extractor below).
os i18n extractemits_views.<view>.emptyStatekeys when a viewdeclares an empty state.
sys_user,sys_organizationandsys_business_unit(fields, options,views, actions); replace the hardcoded English tab/section/action labels in
the
sys_user,sys_organizationandsys_positiondetail pages withinline i18n label objects, and route the user Security tab through
record:quick_actionsso object action labels localize.(
MessagingTranslations) covering the sevensys_*messaging objects(inbox message, receipts, deliveries, preferences, subscriptions, templates,
HTTP deliveries), registered on
kernel:ready; zh-CN is fully translatedand ja-JP/es-ES cover
sys_inbox_message(incl. themineview emptystate).
Patch Changes
os validatenow runs the ADR-0090 D7 security posture check, restoring its documented contract of being the artifact-free run of the same gates asos compile/os build. Previously a stack could passvalidateand then fail the build — e.g. a custom object with no explicitsharingModel(OWD), which the posture linter rejects at compile. Error findings gate validation; advisory findings print as warnings (and join the--jsonwarnings array).@objectstack/lint@14.8.0
Minor Changes
10e8983: ADR-0089 D3b: add the
validateVisibilityPredicateslint rule for conditional-visibility keys, wired intoos validateandos compileas advisory warnings.Two rules, both
warning(never fail the build):visibility-alias-deprecated— avisibleOn(view form section/field) orvisibility(page component) key in authored source. It still works — the schema normalizes it tovisibleWhenat parse — but the canonical key isvisibleWhen. Fix: rename the key (same CEL value).visibility-root-mislayered— a runtime view/page visibility predicate rooted atdata.(the metadata-editing-form root). Runtime record surfaces bindrecord+current_user(pages also exposepage.<var>), so adata.-rooted predicate here never matches and the element renders unconditionally. Fix: userecord./page..The rule runs on the pre-parse stack (like
validate-list-view-mode) so it can see the deprecated alias the author actually wrote before the schema folds it intovisibleWhen.Patch Changes
@objectstack/metadata-protocol@14.8.0
Minor Changes
1dede32: Make the
sys_permission_setdata record a pure projection of the metadata layer (ADR-0094; framework#2875) — one authoritative store for permission-set definitions, retiring the two-store split-brain behind the sys_permission_set: env-scope permission metadata saves don't project onto the queryable data record #2857 display-freshness class.@objectstack/metadata-protocol: newregisterMutationProjector(type, fn)— an awaited, best-effort per-type hook invoked after persistence insidesaveMetaItem/publishMetaItem/deleteMetaItem, so a derived data-plane read-model is already consistent when the write returns (outcome surfaced asprojectionAppliedon the response). Complements the fire-and-forgetonMetadataMutationlisteners.@objectstack/plugin-security: every non-system data-door write onsys_permission_set(Setup CRUD, bulk imports, any ObjectQL path) is redirected into the metadata store by an engine middleware; the record is written only by the projector. Boot reconciliation projects env overlays onto records (Studio-created sets now appear in Setup), backfills legacy data-door-only records into metadata once, and re-projects drifted records from the effective body (metadata wins). The projector also syncs the metadata manager's in-memorypermissionentry, so evaluator resolution and the Setup display can no longer disagree.Behavior changes: "deleting" an artifact-backed permission set through the data door now resets it to its declared body instead of removing the row; renaming a set through the data door is rejected (
400) — clone to a new name instead; record edits that predate this change and are shadowed by a metadata definition are discarded (loud warning) at first boot, since they were never enforced.Moved exports (from
@objectstack/plugin-security):upsertEnvPermissionSetnow lives inpermission-set-projection.js(still re-exported from the package root) and creates missing records;projectEnvPermissionOnMutation/subscribeEnvPermissionProjectionare replaced byprojectPermissionMutation/registerPermissionSetProjection.Patch Changes
@objectstack/plugin-security@14.8.0
Minor Changes
f0acf25: Surface a
customizedflag onsys_permission_setso Setup can tell — at a glance — which packaged permission sets have an environment overlay (ADR-0094).customized: trueon amanaged_by:'package'row while an overlay shadows its shipped baseline, and clears it when the overlay is removed (the data-door "reset"). Env-authored rows are never flagged (an env set is the definition, not a customization of one).sys_permission_setand to the "All" Setup list view (alongsidemanaged_by), so a packaged-but-customized set is visible without opening the Studio layered diff.712328a: Package-owned permission sets are now customizable through the standard environment metadata overlay (ADR-0094 D5, revised — closes framework#2898 by making the overlay FIRST-CLASS instead of rejecting it).
saveMetaItem('permission', …)on a package-owned set is a real customization: the awaited projector applies the effective (overlay-wins) body to thesys_permission_setrecord while preserving itsmanaged_by:'package'+package_idprovenance, and the evaluator enforces it.transfer/restore/purge) on package rows; kernels without a metadata overlay layer keep the legacy full refusal.permissionthe one type whose declaredallowOrgOverride: trueis a lie, and clone-to-customize forks away from vendor baseline updates.Note the standard overlay trade, now applicable to permission sets: while an overlay pins a set, later vendor baseline changes (including tightenings) don't take effect for that name until the overlay is reset or re-authored — surfaced by the Studio layered diff and covered by ADR-0091 recertification.
Also lands a dogfood proof (
showcase-permission-projection) covering the full ADR-0094 invariant set — write-through, awaited projection, declared-set edit becomes an enforced overlay, package-set customize/reset lifecycle — registered in the liveness proof registry.1dede32: Make the
sys_permission_setdata record a pure projection of the metadata layer (ADR-0094; framework#2875) — one authoritative store for permission-set definitions, retiring the two-store split-brain behind the sys_permission_set: env-scope permission metadata saves don't project onto the queryable data record #2857 display-freshness class.@objectstack/metadata-protocol: newregisterMutationProjector(type, fn)— an awaited, best-effort per-type hook invoked after persistence insidesaveMetaItem/publishMetaItem/deleteMetaItem, so a derived data-plane read-model is already consistent when the write returns (outcome surfaced asprojectionAppliedon the response). Complements the fire-and-forgetonMetadataMutationlisteners.@objectstack/plugin-security: every non-system data-door write onsys_permission_set(Setup CRUD, bulk imports, any ObjectQL path) is redirected into the metadata store by an engine middleware; the record is written only by the projector. Boot reconciliation projects env overlays onto records (Studio-created sets now appear in Setup), backfills legacy data-door-only records into metadata once, and re-projects drifted records from the effective body (metadata wins). The projector also syncs the metadata manager's in-memorypermissionentry, so evaluator resolution and the Setup display can no longer disagree.Behavior changes: "deleting" an artifact-backed permission set through the data door now resets it to its declared body instead of removing the row; renaming a set through the data door is rejected (
400) — clone to a new name instead; record edits that predate this change and are shadowed by a metadata definition are discarded (loud warning) at first boot, since they were never enforced.Moved exports (from
@objectstack/plugin-security):upsertEnvPermissionSetnow lives inpermission-set-projection.js(still re-exported from the package root) and creates missing records;projectEnvPermissionOnMutation/subscribeEnvPermissionProjectionare replaced byprojectPermissionMutation/registerPermissionSetProjection.Patch Changes
a199626:
claimSeedOwnershipnow skips external (federated) objects — those with anexternalremote-table binding (ADR-0015) — the same way it already skipsmanagedByandsys_*objects.The seed-ownership backfill walks every registered object that exposes an
owner_idcolumn and re-owns its unowned rows to the first admin. Federated objects getowner_idauto-injected into their schema, so they passed the filter and the backfill issuedselect id from <remote_table> where owner_id is nullagainst a read-only remote datasource whose table may not be provisioned yet at boot — producing startup errors likeFind operation failed … no such table: customers. External objects are read-only (DDL forbidden, writes double-opt-in) and their ownership is not the platform's to reassign, so they are excluded from the scan entirely.Updated dependencies [16b4bf6]
Updated dependencies [16b4bf6]
Updated dependencies [10e8983]
Updated dependencies [607aaf4]
Updated dependencies [bb71321]
@objectstack/service-automation@14.8.0
Minor Changes
16b4bf6: ADR-0087 P1:元数据转换层(conversion layer,D2)——大多数破坏性变更对使用方零操作。
@objectstack/spec新增conversions/模块:一张按协议大版本组织、声明式、无损的转换表,在加载时(normalizeStackInput——defineStack/objectstack validate/lint/info/doctor共用的同一入口)把旧(N−1)形态的元数据改写为规范的 N 形态,并对每处改写发出结构化弃用通知(OS_METADATA_CONVERTED)。使用方仍按旧形态编写也能零操作加载,运行时只会看到规范形态。这是把 Kubernetes storage-version/conversion 模型套用到元数据上;它与 Prime Directive Add comprehensive test suite for Zod schema validation #12 禁止的“使用方侧方言兜底”在每个维度上都相反:一张集中、随 spec 版本化、声明化、显式(每次应用都发通知)、带测试(每条附 old→new fixture)、会过期(仅在一个大版本内加载期生效,之后退役并沉淀进 P2 迁移链)的表,而非散落的cfg.a ?? cfg.b。首批以已发布的 protocol 11 重命名回填播种:
flow-node-http-callout-rename:流程回调节点http_request/http_call/webhook→http。page-kind-jsx-to-html:页面kind: 'jsx'→'html'(ADR-0080 规范拼写)。flow-node-crud-filter-alias:CRUD 流程节点config.filters→config.filter。运行时加载 seam(存量流程零回归的关键)。 转换不仅接在构建/校验入口,也接到运行时
AutomationEngine.registerFlow(在FlowSchema.parse之前跑,新增applyConversionsToFlow)。这样从数据库 rehydrate 的存量流程也会被规范化——否则删掉filters执行器兜底会让存量delete_record/update_record的过滤条件被静默清空(退化成作用于全表)。这才真正兑现 D2 “applied at load, the same seam”。开放命名空间的冲突守卫(第三方零静默误伤)。
flow.node.type是开放命名空间(ADR-0018 移除了 enum gate),退役的官方名可能被第三方复用为自定义节点。转换层新增“保留名冲突”感知:运行时 seam 传入本环境已注册的执行器类型,若某退役别名(http_request/http_call/webhook)正被活的自定义执行器占用,则拒绝改写并发出响亮的结构化告警OS_METADATA_CONVERSION_CONFLICT(带节点位置、conversion id、“请改名”的处置建议),而不是静默把它改成http破坏第三方节点。构建/校验入口无注册表上下文,历史别名照常转换。并落实 PD Add comprehensive test suite for Zod schema validation #12 退役路径示范:
filters→filter别名从service-automation执行器的readAliasedConfig兜底中删除,提升为上面这条声明式转换条目;执行器改为直接读取规范键cfg.filter。新增导出(纯增量,无破坏):
applyConversions、applyConversionsToFlow、collectConversionNotices、ALL_CONVERSIONS、CONVERSIONS_BY_MAJOR、CONVERSION_NOTICE_CODE、CONVERSION_CONFLICT_CODE,以及类型MetadataConversion、ConversionNotice、ConversionApplication、ConversionFixture、ConversionContext、ConversionConflictNotice、ConversionConflictDetail、ApplyConversionsOptions、NormalizeStackInputOptions。normalizeStackInput现接受可选第二参{ onConversionNotice, convert }(向后兼容)。Patch Changes
@objectstack/service-messaging@14.8.0
Minor Changes
bb71321: i18n: translate the system account/messaging surfaces end to end.
ObjectTranslationDataSchema/ObjectTranslationNodeSchemanowaccept
_views.<view>.emptyState.{title,message}so list-view empty statesare translatable (contract-first for the extractor below).
os i18n extractemits_views.<view>.emptyStatekeys when a viewdeclares an empty state.
sys_user,sys_organizationandsys_business_unit(fields, options,views, actions); replace the hardcoded English tab/section/action labels in
the
sys_user,sys_organizationandsys_positiondetail pages withinline i18n label objects, and route the user Security tab through
record:quick_actionsso object action labels localize.(
MessagingTranslations) covering the sevensys_*messaging objects(inbox message, receipts, deliveries, preferences, subscriptions, templates,
HTTP deliveries), registered on
kernel:ready; zh-CN is fully translatedand ja-JP/es-ES cover
sys_inbox_message(incl. themineview emptystate).
Patch Changes
@objectstack/spec@14.8.0
Minor Changes
16b4bf6: ADR-0087 P1:元数据转换层(conversion layer,D2)——大多数破坏性变更对使用方零操作。
@objectstack/spec新增conversions/模块:一张按协议大版本组织、声明式、无损的转换表,在加载时(normalizeStackInput——defineStack/objectstack validate/lint/info/doctor共用的同一入口)把旧(N−1)形态的元数据改写为规范的 N 形态,并对每处改写发出结构化弃用通知(OS_METADATA_CONVERTED)。使用方仍按旧形态编写也能零操作加载,运行时只会看到规范形态。这是把 Kubernetes storage-version/conversion 模型套用到元数据上;它与 Prime Directive Add comprehensive test suite for Zod schema validation #12 禁止的“使用方侧方言兜底”在每个维度上都相反:一张集中、随 spec 版本化、声明化、显式(每次应用都发通知)、带测试(每条附 old→new fixture)、会过期(仅在一个大版本内加载期生效,之后退役并沉淀进 P2 迁移链)的表,而非散落的cfg.a ?? cfg.b。首批以已发布的 protocol 11 重命名回填播种:
flow-node-http-callout-rename:流程回调节点http_request/http_call/webhook→http。page-kind-jsx-to-html:页面kind: 'jsx'→'html'(ADR-0080 规范拼写)。flow-node-crud-filter-alias:CRUD 流程节点config.filters→config.filter。运行时加载 seam(存量流程零回归的关键)。 转换不仅接在构建/校验入口,也接到运行时
AutomationEngine.registerFlow(在FlowSchema.parse之前跑,新增applyConversionsToFlow)。这样从数据库 rehydrate 的存量流程也会被规范化——否则删掉filters执行器兜底会让存量delete_record/update_record的过滤条件被静默清空(退化成作用于全表)。这才真正兑现 D2 “applied at load, the same seam”。开放命名空间的冲突守卫(第三方零静默误伤)。
flow.node.type是开放命名空间(ADR-0018 移除了 enum gate),退役的官方名可能被第三方复用为自定义节点。转换层新增“保留名冲突”感知:运行时 seam 传入本环境已注册的执行器类型,若某退役别名(http_request/http_call/webhook)正被活的自定义执行器占用,则拒绝改写并发出响亮的结构化告警OS_METADATA_CONVERSION_CONFLICT(带节点位置、conversion id、“请改名”的处置建议),而不是静默把它改成http破坏第三方节点。构建/校验入口无注册表上下文,历史别名照常转换。并落实 PD Add comprehensive test suite for Zod schema validation #12 退役路径示范:
filters→filter别名从service-automation执行器的readAliasedConfig兜底中删除,提升为上面这条声明式转换条目;执行器改为直接读取规范键cfg.filter。新增导出(纯增量,无破坏):
applyConversions、applyConversionsToFlow、collectConversionNotices、ALL_CONVERSIONS、CONVERSIONS_BY_MAJOR、CONVERSION_NOTICE_CODE、CONVERSION_CONFLICT_CODE,以及类型MetadataConversion、ConversionNotice、ConversionApplication、ConversionFixture、ConversionContext、ConversionConflictNotice、ConversionConflictDetail、ApplyConversionsOptions、NormalizeStackInputOptions。normalizeStackInput现接受可选第二参{ onConversionNotice, convert }(向后兼容)。16b4bf6: ADR-0087 P2:可重放迁移链 + 机器可读变更清单(D3 / D4)。
D3 —— 迁移链(
@objectstack/spec新增migrations/)。 一条永久、有序、按协议大版本组织的迁移链。每个大版本的步骤由两个来源合成:已毕业的转换(P1 的 D2 转换条目从加载路径退役后,以其 id 引用复用,作为该大版本的“机械变换”,转换与 fixture 不重复)和语义变更(无损映射无法表达的破坏,以结构化 TODO —— surface / 原因 / 验收标准 —— 呈现,而非静默或有损自动改写)。applyMetaMigrations(stack, fromMajor, toMajor?)折叠fromMajor+1 … 当前的步骤,一次性把任意历史大版本的元数据迁到当前;跨大版本是设计主场景。每一跳(hop)都做检查点,便于逐跳验证与二分定位。时效性从不承重 —— 迟到的使用方到达时重放链即可。composeMigrationChain、MigrationFloorError,以及显式的发布策略旋钮MIGRATION_SUPPORT_FLOOR(链能回溯到多久)。titleFormat复合模板 →nameField(需公式字段,非无损)、SQL 式 RLS 谓词 → 规范 CEL。D4 ——
spec-changes.json变更清单。 Zod 定义的机器可读记录{ from, to, added, converted, migrated, removed },由composeSpecChanges(from, to, surfaceDiff?)跨大版本折叠转换表(D2)与迁移集(D3),并与发布期 api-surface 差异连接。按大版本的清单可组合成单一from→to视图;后续生成式升级指南与 P3 的 MCPspec_changes工具都是它的投影。CLI ——
objectstack migrate meta --from N。 重放迁移链:展示生成的、经ObjectStackDefinitionSchema校验的机械变更 diff(逐条path: 旧 → 新)与需人工判断的语义 TODO;--to、--step(逐跳检查点)、--out <file.json>(把规范化后的栈写为可 diff 的 JSON 快照)、--json。命令不静默改写 TS 配置源(AST 改写不安全且有损)—— 输出供使用方 agent 审阅采纳,这正是握手错误(P0)所指向的命令。normalizeStackInput新增可选convert: false(仅做 map→array,不跑 D2 转换),供migrate meta对原始编写源重放链、把每处改写归因到对应链步。新增导出纯增量,无破坏性移除。10e8983: ADR-0089: unify the conditional-visibility predicate under one canonical key,
visibleWhen, across every layer (data field, view form section/field, page component). This aligns visibility with the existingreadonlyWhen/requiredWhenfamily and theconditionalRequired → requiredWhenprecedent.Canonical key:
visibleWhen— a CEL predicate; the element is shown only when it is TRUE. The binding root is still set by the layer: runtime record forms and pages bindrecord+current_user(pages also exposepage.<var>); metadata-editing forms (*.form.ts) binddata.Deprecated aliases (still accepted): the view key
visibleOnand the page keyvisibilityare now@deprecated. Both are folded intovisibleWhenonce, at the schema boundary (a zod.transform()), so consumers only ever readvisibleWhen. When both a canonical and an alias key are present, the canonical wins.Migration (L1 — no consumer action required; existing metadata keeps working):
visibleOn: "<cel>"→visibleWhen: "<cel>"visibility: "<cel>"→visibleWhen: "<cel>"visibleWhen— unchanged.Out of scope (unchanged): the boolean
visible(Tab on/off), fieldhidden, galleryvisibleFields, and unrelatedvisibilityenums (feed / package / environment / agent). Aliases remain for the standard deprecation window and are removed in a future major.bb71321: i18n: translate the system account/messaging surfaces end to end.
ObjectTranslationDataSchema/ObjectTranslationNodeSchemanowaccept
_views.<view>.emptyState.{title,message}so list-view empty statesare translatable (contract-first for the extractor below).
os i18n extractemits_views.<view>.emptyStatekeys when a viewdeclares an empty state.
sys_user,sys_organizationandsys_business_unit(fields, options,views, actions); replace the hardcoded English tab/section/action labels in
the
sys_user,sys_organizationandsys_positiondetail pages withinline i18n label objects, and route the user Security tab through
record:quick_actionsso object action labels localize.(
MessagingTranslations) covering the sevensys_*messaging objects(inbox message, receipts, deliveries, preferences, subscriptions, templates,
HTTP deliveries), registered on
kernel:ready; zh-CN is fully translatedand ja-JP/es-ES cover
sys_inbox_message(incl. themineview emptystate).
Patch Changes
607aaf4: 导出文件名本地化 + 系统字段标签内置多语言回退。
@objectstack/rest— 导出下载文件名:GET /data/:object/export的Content-Disposition不再是裸的<对象名>.<扩展名>,改为「对象显示名-时间戳」:ASCII 兜底用 API 名(filename="contracts-20260714-153045.xlsx"),本地化标签(如中文)按 RFC 5987/6266 编码进filename*=UTF-8''…(浏览器直接下载得到合同-20260714-153045.xlsx)。新增导出exportContentDisposition(objectName, label, ext, now?)。@objectstack/spec— 系统字段标签回退:ObjectQL 注册表给每个对象注入的系统字段(owner_id/created_at/created_by/updated_at/updated_by)只带英文标签,自定义对象又没有对应的翻译条目,导致中文界面的列表表头、导出文件、导入模板里漏出 "Owner"/"Created At" 等英文。translateObject现内置这五个字段的 en/zh-CN/ja-JP/es-ES 标签表(措辞与平台生成的翻译包一致),仅当字段仍是注入的英文默认值时套用——作者自定义的标签绝不覆盖;无翻译包时也生效(translateObject不再因缺 bundle 而提前返回,REST 元数据翻译路径同步放宽,缓存 ETag 本就按 locale 分键,无缓存串味风险)。@objectstack/plugin-reports— 附件文件名:定时报表附件的文件名清洗从「非 ASCII 全部替换成_」改为按 Unicode 字母/数字保留(\p{L}\p{N}),中文计划名不再变成一串下划线。@objectstack/rest— 导入接受翻译后的选项标签(导出 ↔ 导入闭环):导出与导入模板写出的是翻译后的选项标签(如待规划),但导入强制转换只认作者原始 schema 的标签/值,导致用户把自己刚导出的本地化文件原样导回时 select 字段全部报invalid_option。prepareImportRequest新增localizeSchema钩子(REST 导入路由传入translateMetaItem),把当前 locale 的翻译标签合并进字段选项作为匹配同义词——作者标签与选项 code 照常匹配,非法值照常报错,翻译失败时降级为仅作者标签匹配。新增导出mergeLocalizedOptionSynonyms(metaMap, localizedMetaMap)。@objectstack/hono@14.8.0
Patch Changes
@objectstack/account@14.8.0
Patch Changes
@objectstack/setup@14.8.0
Patch Changes
@objectstack/studio@14.8.0
Patch Changes
@objectstack/client@14.8.0
Patch Changes
mapDataError)对沙箱 hook/action 抛错解包SandboxError.innerMessage(并对丢失实例的情况正则剥离hook 'x' threw: Error:包装,保留TypeError:等非默认错误名);客户端 SDK 的error.message不再拼[ObjectStack] CODE:前缀(code 仍在error.code上可编程读取)。控制台报错 toast 从[ObjectStack] hook 'pm_ref_base' threw: Error: 制作基地被…变为只显示业务消息本身;完整调试包装仍写入服务端日志。@objectstack/client-react@14.8.0
Patch Changes
@objectstack/cloud-connection@14.8.0
Patch Changes
@objectstack/connector-mcp@14.8.0
Patch Changes
@objectstack/connector-openapi@14.8.0
Patch Changes
@objectstack/connector-rest@14.8.0
Patch Changes
@objectstack/connector-slack@14.8.0
Patch Changes
@objectstack/console@14.8.0
Patch Changes
d1b1a94: Console (objectui) refreshed to
60610531013f. Frontend changes in this range:objectui range:
95835581f1d0...60610531013f@objectstack/core@14.8.0
Patch Changes
create-objectstack@14.8.0
Patch Changes
blanktemplate had^6.0.0ranges frozen in while the registry was publishing 14.x, sonpm create objectstackproduced a project eight majors behind the docs — and the template's code no longer compiled against 14.x anyway (Field.longTextremoved,api.restno longer adefineStackkey,sharingModelnow required by the ADR-0090 security gate). The template is updated to the current API, and the scaffolder now rewrites every@objectstack/*range in the generatedpackage.jsonto^<its own version>(all packages version in lockstep), so generated projects track the release even if the committed template drifts again. A consistency test ratchets the template's major and the README's template table against the registry. The template README also documents the seeded dev-admin sign-in that data-API curls need.@objectstack/formula@14.8.0
Patch Changes
@objectstack/mcp@14.8.0
Patch Changes
@objectstack/metadata@14.8.0
Patch Changes
@objectstack/metadata-core@14.8.0
Patch Changes
@objectstack/metadata-fs@14.8.0
Patch Changes
@objectstack/objectql@14.8.0
Patch Changes
@objectstack/observability@14.8.0
Patch Changes
@objectstack/platform-objects@14.8.0
Patch Changes
bb71321: i18n: translate the system account/messaging surfaces end to end.
ObjectTranslationDataSchema/ObjectTranslationNodeSchemanowaccept
_views.<view>.emptyState.{title,message}so list-view empty statesare translatable (contract-first for the extractor below).
os i18n extractemits_views.<view>.emptyStatekeys when a viewdeclares an empty state.
sys_user,sys_organizationandsys_business_unit(fields, options,views, actions); replace the hardcoded English tab/section/action labels in
the
sys_user,sys_organizationandsys_positiondetail pages withinline i18n label objects, and route the user Security tab through
record:quick_actionsso object action labels localize.(
MessagingTranslations) covering the sevensys_*messaging objects(inbox message, receipts, deliveries, preferences, subscriptions, templates,
HTTP deliveries), registered on
kernel:ready; zh-CN is fully translatedand ja-JP/es-ES cover
sys_inbox_message(incl. themineview emptystate).
Updated dependencies [16b4bf6]
Updated dependencies [16b4bf6]
Updated dependencies [10e8983]
Updated dependencies [607aaf4]
Updated dependencies [bb71321]
@objectstack/driver-memory@14.8.0
Patch Changes
@objectstack/driver-mongodb@14.8.0
Patch Changes
@objectstack/driver-sql@14.8.0
Patch Changes
ERR_DLOPEN_FAILEDstack trace when nativebetter-sqlite3cannot load (an ABI /NODE_MODULE_VERSIONmismatch after a Node upgrade, or the native addon was never built). The native → wasm SQLite step-down is unchanged — this only stops a handled, non-fatal fallback from reading like a fatal crash in the dev console, and points atpnpm rebuild better-sqlite3for native speed. Any otherPRAGMAfailure keeps its full warning.@objectstack/driver-sqlite-wasm@14.8.0
Patch Changes
a199626: Harden the wasm SQLite driver (the dev fallback used when native
better-sqlite3has an ABI mismatch) against three failure modes that spammedpnpm dev:writeFilethat truncates-then-streams in place, so a process killed mid-write (a dev-server restart, Ctrl-C, or crash — likely underon-write, where every dispatcher tick flushes) left a torn file that sql.js rejected on the next boot withdatabase disk image is malformed. Flushes now write to a sibling temp file,fsync, and atomicallyrename()over the target, so a reader always sees a complete image.PRAGMA quick_check), quarantines the bad file to<db>.corrupt-<timestamp>, and boots on a fresh database — instead of failing every query forever with no path to recovery.undefinedbindings. A rawundefinedbinding made sql.jsthrowa plain string (Wrong API use : tried to bind a value of an unknown type (undefined).), which aborted the write and logged as a garbled char-indexed object.undefinedis now coerced to SQLNULL, matching the driver'suseNullAsDefaultsemantics and the native better-sqlite3 path.Updated dependencies [16b4bf6]
Updated dependencies [16b4bf6]
Updated dependencies [10e8983]
Updated dependencies [84650c5]
Updated dependencies [607aaf4]
Updated dependencies [bb71321]
@objectstack/embedder-openai@14.8.0
Patch Changes
@objectstack/knowledge-memory@14.8.0
Patch Changes
@objectstack/knowledge-ragflow@14.8.0
Patch Changes
@objectstack/plugin-approvals@14.8.0
Patch Changes
@objectstack/plugin-audit@14.8.0
Patch Changes
@objectstack/plugin-auth@14.8.0
Patch Changes
@objectstack/plugin-dev@14.8.0
Patch Changes
@objectstack/plugin-email@14.8.0
Patch Changes
@objectstack/plugin-hono-server@14.8.0
Patch Changes
@objectstack/plugin-reports@14.8.0
Patch Changes
607aaf4: 导出文件名本地化 + 系统字段标签内置多语言回退。
@objectstack/rest— 导出下载文件名:GET /data/:object/export的Content-Disposition不再是裸的<对象名>.<扩展名>,改为「对象显示名-时间戳」:ASCII 兜底用 API 名(filename="contracts-20260714-153045.xlsx"),本地化标签(如中文)按 RFC 5987/6266 编码进filename*=UTF-8''…(浏览器直接下载得到合同-20260714-153045.xlsx)。新增导出exportContentDisposition(objectName, label, ext, now?)。@objectstack/spec— 系统字段标签回退:ObjectQL 注册表给每个对象注入的系统字段(owner_id/created_at/created_by/updated_at/updated_by)只带英文标签,自定义对象又没有对应的翻译条目,导致中文界面的列表表头、导出文件、导入模板里漏出 "Owner"/"Created At" 等英文。translateObject现内置这五个字段的 en/zh-CN/ja-JP/es-ES 标签表(措辞与平台生成的翻译包一致),仅当字段仍是注入的英文默认值时套用——作者自定义的标签绝不覆盖;无翻译包时也生效(translateObject不再因缺 bundle 而提前返回,REST 元数据翻译路径同步放宽,缓存 ETag 本就按 locale 分键,无缓存串味风险)。@objectstack/plugin-reports— 附件文件名:定时报表附件的文件名清洗从「非 ASCII 全部替换成_」改为按 Unicode 字母/数字保留(\p{L}\p{N}),中文计划名不再变成一串下划线。@objectstack/rest— 导入接受翻译后的选项标签(导出 ↔ 导入闭环):导出与导入模板写出的是翻译后的选项标签(如待规划),但导入强制转换只认作者原始 schema 的标签/值,导致用户把自己刚导出的本地化文件原样导回时 select 字段全部报invalid_option。prepareImportRequest新增localizeSchema钩子(REST 导入路由传入translateMetaItem),把当前 locale 的翻译标签合并进字段选项作为匹配同义词——作者标签与选项 code 照常匹配,非法值照常报错,翻译失败时降级为仅作者标签匹配。新增导出mergeLocalizedOptionSynonyms(metaMap, localizedMetaMap)。Updated dependencies [16b4bf6]
Updated dependencies [16b4bf6]
Updated dependencies [10e8983]
Updated dependencies [607aaf4]
Updated dependencies [bb71321]
@objectstack/plugin-sharing@14.8.0
Patch Changes
@objectstack/plugin-webhooks@14.8.0
Patch Changes
@objectstack/rest@14.8.0
Patch Changes
607aaf4: 导出文件名本地化 + 系统字段标签内置多语言回退。
@objectstack/rest— 导出下载文件名:GET /data/:object/export的Content-Disposition不再是裸的<对象名>.<扩展名>,改为「对象显示名-时间戳」:ASCII 兜底用 API 名(filename="contracts-20260714-153045.xlsx"),本地化标签(如中文)按 RFC 5987/6266 编码进filename*=UTF-8''…(浏览器直接下载得到合同-20260714-153045.xlsx)。新增导出exportContentDisposition(objectName, label, ext, now?)。@objectstack/spec— 系统字段标签回退:ObjectQL 注册表给每个对象注入的系统字段(owner_id/created_at/created_by/updated_at/updated_by)只带英文标签,自定义对象又没有对应的翻译条目,导致中文界面的列表表头、导出文件、导入模板里漏出 "Owner"/"Created At" 等英文。translateObject现内置这五个字段的 en/zh-CN/ja-JP/es-ES 标签表(措辞与平台生成的翻译包一致),仅当字段仍是注入的英文默认值时套用——作者自定义的标签绝不覆盖;无翻译包时也生效(translateObject不再因缺 bundle 而提前返回,REST 元数据翻译路径同步放宽,缓存 ETag 本就按 locale 分键,无缓存串味风险)。@objectstack/plugin-reports— 附件文件名:定时报表附件的文件名清洗从「非 ASCII 全部替换成_」改为按 Unicode 字母/数字保留(\p{L}\p{N}),中文计划名不再变成一串下划线。@objectstack/rest— 导入接受翻译后的选项标签(导出 ↔ 导入闭环):导出与导入模板写出的是翻译后的选项标签(如待规划),但导入强制转换只认作者原始 schema 的标签/值,导致用户把自己刚导出的本地化文件原样导回时 select 字段全部报invalid_option。prepareImportRequest新增localizeSchema钩子(REST 导入路由传入translateMetaItem),把当前 locale 的翻译标签合并进字段选项作为匹配同义词——作者标签与选项 code 照常匹配,非法值照常报错,翻译失败时降级为仅作者标签匹配。新增导出mergeLocalizedOptionSynonyms(metaMap, localizedMetaMap)。e46169c: 面向最终用户的错误消息去掉调试噪音:REST 数据路由(
mapDataError)对沙箱 hook/action 抛错解包SandboxError.innerMessage(并对丢失实例的情况正则剥离hook 'x' threw: Error:包装,保留TypeError:等非默认错误名);客户端 SDK 的error.message不再拼[ObjectStack] CODE:前缀(code 仍在error.code上可编程读取)。控制台报错 toast 从[ObjectStack] hook 'pm_ref_base' threw: Error: 制作基地被…变为只显示业务消息本身;完整调试包装仍写入服务端日志。Updated dependencies [16b4bf6]
Updated dependencies [16b4bf6]
Updated dependencies [10e8983]
Updated dependencies [607aaf4]
Updated dependencies [bb71321]
@objectstack/runtime@14.8.0
Patch Changes
@objectstack/service-analytics@14.8.0
Patch Changes
@objectstack/service-cache@14.8.0
Patch Changes
@objectstack/service-cluster@14.8.0
Patch Changes
@objectstack/service-cluster-redis@14.8.0
Patch Changes
@objectstack/service-datasource@14.8.0
Patch Changes
@objectstack/service-i18n@14.8.0
Patch Changes
@objectstack/service-job@14.8.0
Patch Changes
@objectstack/service-knowledge@14.8.0
Patch Changes
@objectstack/service-package@14.8.0
Patch Changes
@objectstack/service-queue@14.8.0
Patch Changes
@objectstack/service-realtime@14.8.0
Patch Changes
@objectstack/service-settings@14.8.0
Patch Changes
@objectstack/service-sms@14.8.0
Patch Changes
@objectstack/service-storage@14.8.0
Patch Changes
@objectstack/trigger-api@14.8.0
Patch Changes
@objectstack/trigger-record-change@14.8.0
Patch Changes
@objectstack/trigger-schedule@14.8.0
Patch Changes
@objectstack/types@14.8.0
Patch Changes
@objectstack/verify@14.8.0
Patch Changes
@objectstack/sdui-parser@14.8.0
objectstack-vscode@14.8.0
@objectstack/example-crm@4.0.86
Patch Changes
@objectstack/example-showcase@0.3.8
Patch Changes
@objectstack/example-todo@4.0.86
Patch Changes
@objectstack/example-embed-objectql@0.0.26
Patch Changes
@objectstack/dogfood@0.0.34
Patch Changes
@objectstack/downstream-contract@0.0.32
Patch Changes