* feat(server,ui-html): AI 联想候选徽标支持切换 🤖 / 🐳 AI 联想候选的来源角标此前硬编码为 🤖,用户无法更改。按固定排位徽标 (#463)的既有做法把它做成可配置项 appearance.candidate_ai_badge_style, 取值 "robot"(🤖,出厂默认)或 "whale"(🐳)。 - 默认值保持 🤖 不变,升级不改变默认观感 - 与固定排位徽标一致,配置里存枚举名而不是字面 emoji,TOML/日志/diff 里不出现图形字符;新增样式只改白名单与展示层映射 - 非法取值一律回退到出厂 🤖,手改 TOML 写错不会让 AI 候选失去来源标识 - 展示层新增纯函数 AiSuggestionBadge(style),沿用既有 badge 字段通道, D2D 与 WebView2 两个后端同时生效,不新增渲染路径 - 配置改动经既有 ConfigChanged → WM_APPLY_IME_CONFIG 链路即时生效, 无需重启输入法进程 - 出厂模板 config.default.toml 与开发配置 config.toml 同步补齐, 避免升级时用户选择被 MergeConfigIntoTemplate 静默丢弃 验证: - server/tests/portable(Linux,g++,无 vcpkg):57 test(s), 0 failure(s) - ui-html settings:vitest 167 passed,tsc --noEmit 通过,vite build 通过 - clang-format 18.1.8 --dry-run --Werror --style=file:改动文件全部通过 - scripts/ci/check-developer-paths.sh 通过;sync-contracts.py --check 通过 * fix(server): 补齐 IsValidCandidateAiBadgeStyle 的跨编译单元声明 ime_config_appearance.cpp 是独立编译单元,无法看到定义在 ime_config.cpp 里的 IsValidCandidateAiBadgeStyle,MSVC 报 C3861。补上 ime_config_internal.h 里的声明——IsValidCandidateFixedBadgeStyle 等同类校验函数都声明在那里。 * refactor(server,ui-html): AI 徽标样式改为单一映射表并精简测试 - AiSuggestionBadgeGlyph 作为样式到字形的唯一映射,配置层白名单 IsValidCandidateAiBadgeStyle 直接查它,新增样式不会两边漂移 - 测试去掉与首条断言重复的一行和恒真的 cloud 断言,改为检查映射表 对已知/未知样式的判定 - 设置页描述写明两种样式对应的 emoji --------- Co-authored-by: Caiyi Liao <216114941+cxk1993@users.noreply.github.com> Co-authored-by: fanlusky <1730976608@qq.com>