现象(17.0.0-rc.1,真机 A/B 实测)
@objectstack/rest 的 filterAppForUser():
if (item.hidden === true && !sysPerms.has('studio.access') && !sysPerms.has('setup.access')) return null;
把应用的 hidden(语义=不进应用切换器的导航呈现开关)当成了「builder-only / 未发布」的访问开关。而平台内置 account(账户)应用按设计就是 hidden: true(@objectstack/platform-objects 的 ACCOUNT_APP,注释:「Surface via the avatar dropdown, not the App Switcher」;console 头像菜单也特判 e.name !== 'account' 单独给它「个人资料」入口)。
结果:
- 普通用户
GET /api/v1/meta/app 中 account 应用被整个抹掉,点头像 →「个人资料」→ 整屏「App not available — it may still be publishing」;改密码/头像/已关联账户/活动会话/收件箱全部不可达;
- 持 setup.access 的管理员一切正常(只挂 Unpublished 黄条)→ 极易被当成偶发故障,长期无人发现。
期望
hidden 只影响导航呈现(应用切换器/我的应用),不参与访问判定;或给内置 account 应用豁免。
复现
- 空库启动 17.0.0-rc.1,建任意普通用户(无 studio/setup.access);
- 普通用户登录 console,点头像 → 个人资料 → App not available;同会话
GET /api/v1/meta/app 无 account。
下游临时对策(修复后可整体删除)
os-project-titanwind-ehr 登记 PLAT-DEF-040,PR steedos-labs/os-project-titanwind-ehr#745:启动插件以系统身份幂等下发 {hidden:false} 的 env 级 overlay(即 UI「Publish」按钮做的事)。副作用是「账户」出现在应用切换器——正因如此更说明 hidden 的两个语义(导航 vs 访问)必须拆开。
现象(17.0.0-rc.1,真机 A/B 实测)
@objectstack/rest的filterAppForUser():把应用的
hidden(语义=不进应用切换器的导航呈现开关)当成了「builder-only / 未发布」的访问开关。而平台内置 account(账户)应用按设计就是hidden: true(@objectstack/platform-objects的ACCOUNT_APP,注释:「Surface via the avatar dropdown, not the App Switcher」;console 头像菜单也特判e.name !== 'account'单独给它「个人资料」入口)。结果:
GET /api/v1/meta/app中 account 应用被整个抹掉,点头像 →「个人资料」→ 整屏「App not available — it may still be publishing」;改密码/头像/已关联账户/活动会话/收件箱全部不可达;期望
hidden只影响导航呈现(应用切换器/我的应用),不参与访问判定;或给内置 account 应用豁免。复现
GET /api/v1/meta/app无 account。下游临时对策(修复后可整体删除)
os-project-titanwind-ehr 登记 PLAT-DEF-040,PR steedos-labs/os-project-titanwind-ehr#745:启动插件以系统身份幂等下发
{hidden:false}的 env 级 overlay(即 UI「Publish」按钮做的事)。副作用是「账户」出现在应用切换器——正因如此更说明 hidden 的两个语义(导航 vs 访问)必须拆开。