fix(dashboard): 修复按触发人鉴权开关刷新回显丢失,并修正 PUT 把策略存成字符串 - #1332
Open
DeepColds wants to merge 1 commit into
Open
Conversation
按触发人鉴权(triggerUserAuth)开关在 Dashboard 打开后刷新配置页会复位为关闭。 排查中发现同一条路径上还有一个更严重的静默 bug,一并修复。 配置页刷新时通过聚合接口 /api/bots 重载,而它依赖 daemon 的 GET /api/bot-default-oncall。该响应从未返回 triggerUserAuth,聚合层 botDefaultsPayload 拿不到字段后输出 null,前端开关据此渲染为关闭。 修复:在 /api/bot-default-oncall 私有响应中补上规范化后的 triggerUserAuth。 缺失 / 关闭仍为 null,开启时完整保留 enabled / tools / fallback。 PUT /api/bot-trigger-user-auth 直接把 JSON.stringify 的结果交给 applyConfigField,而 json kind 的 applyConfigField 不解析、原样写入,于是 bots.json 里存的是一个 JSON **字符串**而不是对象。三个后果全是静默的: - getBot().config.triggerUserAuth 是 string,`?.enabled` 恒为 undefined —— 开关看着开了,凭证边界从未真正建立(即用户以为已生效的安全设置并未生效) - 共享 parser 从未被调用,fallback:'device' 这类被刻意禁止的值也会 200 落盘 - 下次 daemon 重启时 bot-registry 的 parser 抛 "must be an object",整个 bots.json 加载失败 —— 一个开关足以让 daemon 拒绝启动 修复:改走 coerceConfigValue + applyConfigField,与 /botconfig set 的 json 分支完全同一口径(同一个 parser、同样的拒绝文案),落盘为归一化后的对象。 同时 PUT 回响生效值,前端保存后无需再拉一次聚合接口。 顺带修正:dashboard 只编辑 enabled/tools/fallback 三个字段,PUT 现在合并保留 UI 没有编辑器的 gitHost / gitTokenExchangeUrl,避免用户只勾一个 tool 就静默 删掉「按当轮身份鉴权 git push」的配置;聚合层也改走共享 parser,手改坏的值 降级为 null(关闭)而不是让整页 bot 行崩掉。 公共 Bot Defaults 聚合路径(/api/bot-default-oncall → botDefaultsPayload → /api/bots)。GET 只多回一个不含密钥的策略对象(仅说明覆盖哪些工具、未授权时 如何降级),已验证 larkAppSecret 不进该响应。改动不涉及 CLI 适配器、后端 (PtyBackend / TmuxBackend)与会话类型,chat 侧 /botconfig 入口逻辑未改动 (本次是让 dashboard 入口对齐它)。 注意:在此修复前用过该开关的 bots.json 里可能已存有字符串形态的 triggerUserAuth,会导致 daemon 启动时报 "must be an object";此时手工把该 字段改为对象(或删掉该字段重新开启)即可恢复。 - 新增 test/dashboard-ipc.test.ts 三例:开启后刷新 GET 仍回显开启(并断言 落盘为对象、内存热更新为对象、写出的配置能被 loadBotConfigs 重新加载); tools-only 保存不丢 gitHost / gitTokenExchangeUrl;device / 错误 tool 名 / 错类型 / 非法 gitHost / 非对象共 5 类非法输入全部 400 且不落盘 - 新增 test/dashboard-bot-payload.test.ts 一例:聚合层开启原样透传,缺失 / null / 显式关闭均为 off,畸形值降级为 null 不抛,且不进公开 summary - 三例新增用例在修复前全部失败、修复后全部通过(已 git stash 验证) - vitest run test/dashboard-ipc.test.ts test/dashboard-bot-payload.test.ts test/trigger-user-auth.test.ts test/command-handler.test.ts test/turn-cli-identity.test.ts test/credential-boundary-prompt.test.ts → 6 files / 654 passed - vitest run test/dashboard*.test.ts test/bot-*.test.ts test/config*.test.ts → 120 files / 2528 passed, 1 skipped - tsc 全量类型检查通过;tsc -p tsconfig.scripts.json、 -p tsconfig.test-mocks.json、audit-public-domains.mjs、 build-dashboard.mjs 均通过(本机 node_modules 缺 yaml 包,src/dsh-runner.ts 报一条与本改动无关的 TS2307,master 上同样存在)
DeepColds
force-pushed
the
fix/dashboard-trigger-user-auth-echo
branch
from
September 8, 2026 13:56
8c5383d to
dbe1836
Compare
Owner
|
已为本 PR 创建自动评审群:https://applink.feishu.cn/client/chat/open?openChatId=oc_1655fa007d8a14408ea848ca361b4627 不过暂时没能把您拉进群——自动拉人依赖一份作者名单文档,您的 GitHub 账号还没登记在里面。麻烦您把 GitHub 账号和飞书信息补进名单文档:https://bytedance.larkoffice.com/wiki/WJ1nwWbtxi89erkNGNbcgkt9nUe ,补好之后后续复审会自动把您拉进群。 (本条为自动评审流程发出,评审结论仅供参考,最终以维护者审阅为准。) |
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.
问题
用户反馈:Dashboard 里「按触发人鉴权」开关打开后,刷新配置页又变回关闭。
排查中发现这条路径上还有一个更严重的静默 bug,一并修复。
1. 刷新回显丢失(用户报告的现象)
配置页刷新时通过聚合接口
/api/bots重载,而它依赖 daemon 的GET /api/bot-default-oncall。该响应从未返回triggerUserAuth,聚合层botDefaultsPayload拿不到字段后输出null,前端开关据此渲染为关闭。修复:在
/api/bot-default-oncall私有响应中补上规范化后的triggerUserAuth。缺失 / 关闭仍为null,开启时完整保留enabled / tools / fallback。2. PUT 把策略存成 JSON 字符串(排查中发现,比现象更严重)
PUT /api/bot-trigger-user-auth直接把JSON.stringify的结果交给applyConfigField,而jsonkind 的applyConfigField不解析、原样写入,于是bots.json里存的是一个 JSON 字符串而不是对象。三个后果全是静默的:getBot().config.triggerUserAuth是string,?.enabled恒为undefinedfallback:'device'这类被刻意禁止的值也会 200 落盘bot-registry的 parser 抛must be an objectbots.json加载失败 —— 一个开关足以让 daemon 拒绝启动实测复现(修复前,在临时目录里跑真实 IPC server):
修复:改走
coerceConfigValue+applyConfigField,与/botconfig set的 json 分支完全同一口径(同一个 parser、同样的拒绝文案),落盘为归一化后的对象。同时 PUT 回响生效值,前端保存后无需再拉一次聚合接口。顺带修正的两处
enabled/tools/fallback三个字段,现在合并保留 UI 没有编辑器的gitHost/gitTokenExchangeUrl,避免用户只勾一个 tool 就静默删掉「按当轮身份鉴权 git push」的配置(与既有/api/bot-riff的RIFF_UI_EDITABLE_KEYS同款做法)null(关闭)而不是让整页 bot 行崩掉影响面
公共 Bot Defaults 聚合路径(
/api/bot-default-oncall→botDefaultsPayload→/api/bots)。larkAppSecret不进该响应PtyBackend/TmuxBackend)与会话类型(话题 / 群 / adopt)/botconfig入口逻辑未改动 —— 本次是让 dashboard 入口对齐它,两个门从此共用同一 parser,不会再各自漂移bots.json里可能已存有字符串形态的triggerUserAuth,会导致 daemon 启动时报must be an object而拒启。两种恢复方式(已实测):
loadBotConfigs()可正常加载(实测PUT 200→ 磁盘typeof = object→ reload ok)测试验证
新增用例(在修复前全部失败、修复后全部通过,已用
git stash逐条验证):test/dashboard-ipc.test.ts三例loadBotConfigs()重新加载(即不再拒启 daemon);省略tools时回显归一化后的全量工具gitHost/gitTokenExchangeUrldevice/ 错误 tool 名 / 错类型 / 非法gitHost/ 非对象共 5 类非法输入全部 400 且不落盘test/dashboard-bot-payload.test.ts一例:聚合层开启原样透传,缺失 /null/ 显式关闭均为 off,畸形值降级为null不抛,且不进公开 summary;并把triggerUserAuth加入「每个可编辑字段都在聚合行里」的契约清单已 rebase 到最新 master(含 #1283 / #1315 / #1326),在新基线上重跑:
构建 / 类型检查(rebase 后重跑):
tsc全量、tsc -p tsconfig.scripts.json、tsc -p tsconfig.test-mocks.json、audit-public-domains.mjs、build-dashboard.mjs均通过。UI 效果
后端字段修复,无视觉改动:开关位置与样式不变,行为上从「刷新后复位为关闭」变为「刷新后保持开启,并正确回显已勾选的 tools 与 fallback」。
🤖 Generated with Claude Code