feat(ask): 新增 per-bot 提问选项布局配置与 Dashboard 开关 - #1587
Conversation
|
你好 @kingchao1024 ,这个 PR 的评审群已经建好(自动流程):请点击这个链接加入飞书评审群(一年有效): 自动拉群时发现你暂时不在自动拉群名单中(系统邀请提示无协作权限)。也可以把你的 GitHub 账号和飞书信息补进这个名单文档:https://bytedance.larkoffice.com/wiki/WJ1nwWbtxi89erkNGNbcgkt9nUe ,补好后后续评审会自动把你拉进群。评审意见会同步在群里和本 PR,谢谢! |
|
你好,感谢这个 PR!整体设计质量很高:完整镜像了现有 阻断项:daemon 重启后配置读不回来(静默回退 compact)
因此真实生命周期是:
复现方式(在本 PR 代码上):往 bots.json 写入 建议修法(与 const normalizedAskOptionLayout = normalizeAskOptionLayout(entry.askOptionLayout);
for (const warning of normalizedAskOptionLayout.warnings) {
logger.warn(`[bot-registry:${entry.larkAppId}] ${warning}`);
}
// config 字面量中(稀疏语义:只在 vertical 时带值也可以):
askOptionLayout: normalizedAskOptionLayout.layout,并建议补两条冷读回归用例(修复前应当变红):
现有用例没拦住这个问题的原因: 建议同批处理:unified 实时卡里的内嵌 ask 不受该配置控制当 bot 配置 两种处理方式任选:
小建议:help 文案与实际渲染对齐文案写的是竖放模式按钮「占满整行宽度」,但从真机截图看短标签按钮仍是按内容宽度(hug-content)排列的。消息卡片 1.0 的 button 支持 以上为自动评审的初步意见,阻断项修复后我们会再复验,最终结论以维护者审阅为准。再次感谢贡献,期待更新! |
|
补充上一条评审意见(根因定位更精确后,修法请注意一个坑): 1) 修复请直接在 parser 字面量取值,不要改用 排查中发现, 2) 回归用例最省的证伪点可以直接打 parser,比走完整 HTTP 链路更聚焦: parseBotConfigsFromText(JSON.stringify([{
larkAppId: 'probe', larkAppSecret: 'x', cliId: 'codex',
askOptionLayout: 'vertical',
}]))[0].askOptionLayout === 'vertical'再配一条经 3) 范围说明(无需在本 PR 处理):排查时顺带发现两个既有字段 以上仍为自动评审的初步意见,最终以维护者审阅为准。 |
|
更正我上一条补充评论中关于既有字段
本 PR 的阻断项与修法不变:只需保证 |
|
Review comments addressed in 0317eaa: 1. Parser cold-read gap (blocker) — fixed as suggested. Regression tests added red-before-fix, all targeting the parser directly:
2. Inline ask cards now respect the config. 3. Help copy aligned with actual rendering (hug-content, not full-width): zh/en now say "one button per row, never squeezed by siblings" instead of "full-width". Verification:
|
为 botmux ask 提问卡片新增 askOptionLayout 配置(compact/vertical): compact 保持现状(action 行每行最多 4 按钮,默认、纯增量);vertical 每个选项独占一行(单列 column_set 整行宽度),长选项文案不再被挤压。 配置链路镜像 replyStyle 体系:bots.json per-bot 字段 → daemon IPC (GET 投影 + PUT /api/bot-ask-option-layout,1KB 上限 + 严格校验 + rmwBotEntry 原子落盘 + 热更新)→ dashboard 代理与 bot-payload 映射 (含离线恢复行透传)→ 配置页「卡片」tab 开关(zh/en i18n)。渲染侧经 零依赖叶子模块的 lookup 解析(同 i18n setBotLookup 防环模式),非法 手改值 fail-soft 回退 compact,不影响发卡。column_set 在旧版卡片 schema 同样受支持,本提交不涉及 schema 迁移。 验证(基于 upstream master 32a0e98): - bunx vitest run --project unit test/ask-card.test.ts test/dashboard-bot-payload.test.ts test/dashboard-ask-option-layout-proxy.test.ts → 86/86 通过 - bunx vitest run --project unit test/dashboard-ipc.test.ts → 291 通过 1 跳过(含新增 PUT 路由用例:vertical 持久化/热更新/落盘、非法值 400、超限 413、compact 置空稀疏删除) - bun run test(unit 全量 26115 用例)→ 26027 通过;68 个失败为本容器既存环境用例(linux-isolation 内核探针等),在无本改动的 upstream 基底上失败完全相同 - bunx tsc --noEmit 通过 Co-Authored-By: Claude Code <noreply@anthropic.com>
… cards 按评审意见修复: 1. 解析器冷读补齐(阻断项):parseBotConfigsFromText 现在与 replyStyle 同款 方式 normalize + warn + 赋值 askOptionLayout。此前该字段只有写侧 (PUT → rmwBotEntry 落盘 + 热更新),daemon 重启后磁盘配置不会读回 BotConfig,静默回退 compact,而 Dashboard 离线恢复行仍显示旧值。 修复刻意走 parser 字面量赋值而非 applyConfigField(后者是 rmwBotEntry + 热同步,与本 bug 同形)。 2. 内嵌 ask 卡(unified/final-only 模式)尊重配置:buildTurnReplyAskElements 经 askOptionLayoutForBot(ask.larkAppId) 取布局,vertical 时输出与独立卡 同语义的一行一按钮(Card JSON 2.0 column_set flex none + weighted 单列, 字段形态与独立卡 1.0 不同故不复用 appendActionRows)。 3. Dashboard 帮助文案对齐实际渲染:竖放为「每行 1 个、不被同排按钮挤压」 (hug-content 渲染,并非占满整行宽度)。 回归测试(先红后绿验证): - test/bot-registry.test.ts 新增 3 例:vertical 线程化进 BotConfig; 缺省/非法值 → undefined;loadBotConfigAtIndex 冷读路径 - test/turn-reply-ask.test.ts 新增 2 例:compact 输出 flow/auto 行(3+1); vertical 输出每选项一行(flex none + weighted 单列) 验证命令与结果: - bunx vitest run --project unit test/bot-registry.test.ts test/turn-reply-ask.test.ts → 178 passed - bunx vitest run --project unit test/ask-card.test.ts → 48 passed - bunx vitest run --project unit test/dashboard-ask-option-layout-proxy.test.ts → 2 passed - bunx tsc --noEmit → 无错误 Co-Authored-By: Claude Code <noreply@anthropic.com>
0317eaa to
cef3d2e
Compare
|
好消息:P0(parser 冷读)和 P2(unified 内嵌卡受控)的修复已经过双轮评审验证、维护者认可,PR 可以合并。合并前只剩一处纯文案/注释一致性清理——之前把竖放的「占满整行宽度」改成了「不被同排按钮挤压」(实际是 hug-content 渲染),但同样的说法和 compact「每行最多 4 个」的数字还残留在几处注释/测试描述里;而 compact 在独立卡是每行 4 个、在实时卡内嵌形态是每行 3 个,写死数字在 unified 模式下对不上。麻烦一轮改完,纯字符串改动,不涉及任何行为逻辑。 用户可见文案(4 处, 去掉写死的「4」,改成对两种形态都成立的「自动换行」:
竖放的「每行 1 个 / one per row」两种形态确实都是 1 个,保持不动。 源码注释与测试描述(6 处,去数字 / 去「占满整行」,与上面口径对齐)
请不要动的两处(容易误改):
改完自查建议:全仓宽匹配反查 以上为自动评审的初步意见,最终以维护者审阅为准。再次感谢,这轮改完我们就走合并流程! |
|
🚀 Released in v3.33.0 |



动机
botmux ask提问卡片的选项按钮目前固定为 action 行横排(每行最多 4 个)。选项文案较长时标签被挤压省略,在移动端尤其难读、难点。本 PR 新增 per-bot 的askOptionLayout配置,允许按 bot 切换为「每个选项独占一行」的竖排布局;默认 compact,未配置的 bot 渲染与现状完全一致,纯增量。vertical 效果:每个选项一个单列
column_set(weighted 列宽占满整行),长文案一行读完。column_set在旧版卡片 schema 同样受支持,本 PR 不涉及 schema 迁移。改动内容
配置链路完整镜像现有
replyStyle体系(13 文件,+515/-3):askOptionLayout字段;稀疏存储(compact 即缺省,从 json 删除该键)askOptionLayout(fail-soft 归一化 + warning);新增PUT /api/bot-ask-option-layout(1KB body 上限、严格 key 白名单校验、rmwBotEntry 原子落盘、live 配置热更新)botDefaultsPayload字段映射、离线恢复行透传ask-option-layout.ts:bot-registry 注入 lookup(同 i18nsetBotLookup防环模式,避免 ask-card → turn-reply-ask → bot-registry 成环),非法手改值 fail-soft 回退 compact,排版笔误永不影响发卡或 daemon 启动测试
基于 upstream master(32a0e98e):
bunx vitest run --project unit test/ask-card.test.ts test/dashboard-bot-payload.test.ts test/dashboard-ask-option-layout-proxy.test.ts→ 86/86 通过bunx vitest run --project unit test/dashboard-ipc.test.ts→ 291 通过 1 跳过(新增 PUT 路由用例覆盖:vertical 持久化/热更新/落盘回读、非法值 400、超限 body 413、compact 置空稀疏删除)bun run test(unit 全量 26115 用例)→ 26027 通过;68 个失败为本机容器既存环境用例(linux-isolation 内核探针等),在未含本改动的 upstream 基底上失败完全相同bunx tsc --noEmit通过截图
见下方评论:Dashboard 开关 + compact/vertical 卡片对比。
备注
replyStyle在 dashboard 离线恢复行未透传属同型既存缺口,本 PR 未一并修复,可另行处理。🤖 Generated with Claude Code