现象
openless-all/app/src/pages/Style.tsx:61-73 的 onMasterToggle:
const onMasterToggle = async () => {
if (!prefs) return;
if (masterEnabled) {
// 全部关闭 → 留 raw 和当前 default 兜底 ← 注释
const next = { ...prefs, enabledModes: [] as PolishMode[] }; // ← 实际行为
setPrefs(next);
await setSettings(next);
} else {
const next = { ...prefs, enabledModes: ['raw', 'light', 'structured', 'formal'] as PolishMode[] };
setPrefs(next);
await setSettings(next);
}
};
注释写的是"留 raw 和当前 default 兜底",但代码把 enabledModes 直接清成 []。
完整链路(UI → IPC → Rust handler)
- UI:
Style.tsx:84 顶栏 toggle 按钮
- IPC:
setSettings(prefs) src/lib/ipc.ts:142 → invokeOrMock('set_settings', { prefs }, …)
- Rust:
commands.rs:116 set_settings(prefs: UserPreferences),写入 preferences.json,并被 coordinator.rs 读取用于切换风格热键和 dictation pipeline
触发条件
用户在 Style 页右上角"总开关"上把开关从开切到关。
实际后果
prefs.enabledModes 被持久化为空数组。后端 coordinator 在切换风格热键 / 选择 polish mode 时如果依赖 enabled_modes 做过滤(建议在 fix 时再 grep 一次 enabled_modes 确认行为),可能:
- 风格切换热键变成空集合,无可选风格
- 或者 fallback 到
defaultMode,与"raw + default 兜底"语义不同
- 或者直接把 dictation 流程降级到 raw(最坏情况:用户以为"关闭风格"=不显示风格选择器,实际是把 polish 整体禁掉)
修复需要先决定的语义
请先在 issue 上明确"总开关 = OFF"到底应该是哪种语义,再改代码:
- 方案 A(按注释):
enabledModes = ['raw', defaultMode],保留 raw 和当前默认两个,用户仍能在两者之间切换
- 方案 B(按当前实现):
enabledModes = [],UI 上风格选择器灰掉,dictation 永远走 raw(这种情况下,注释要改,且要确认 coordinator 不会对 [] 反常处理)
- 方案 C:
enabledModes 只保留 defaultMode(极简)
建议接受标准
不在范围
现象
openless-all/app/src/pages/Style.tsx:61-73的onMasterToggle:注释写的是"留 raw 和当前 default 兜底",但代码把
enabledModes直接清成[]。完整链路(UI → IPC → Rust handler)
Style.tsx:84顶栏 toggle 按钮setSettings(prefs)src/lib/ipc.ts:142→invokeOrMock('set_settings', { prefs }, …)commands.rs:116set_settings(prefs: UserPreferences),写入preferences.json,并被coordinator.rs读取用于切换风格热键和 dictation pipeline触发条件
用户在 Style 页右上角"总开关"上把开关从开切到关。
实际后果
prefs.enabledModes被持久化为空数组。后端coordinator在切换风格热键 / 选择 polish mode 时如果依赖enabled_modes做过滤(建议在 fix 时再 grep 一次enabled_modes确认行为),可能:defaultMode,与"raw + default 兜底"语义不同修复需要先决定的语义
请先在 issue 上明确"总开关 = OFF"到底应该是哪种语义,再改代码:
enabledModes = ['raw', defaultMode],保留 raw 和当前默认两个,用户仍能在两者之间切换enabledModes = [],UI 上风格选择器灰掉,dictation 永远走 raw(这种情况下,注释要改,且要确认 coordinator 不会对[]反常处理)enabledModes只保留defaultMode(极简)建议接受标准
prefs.enabledModes的最终值coordinator.rs对enabled_modes == []的实际处理是否符合选定语义不在范围