## 现象 - 触发条件:打开设置页“提供商”区域,字段初始值为 `''`,`readCredential()` 异步返回前发生 blur,或旧窗口里空字段失焦。 - 当前表现:`CredentialField.onBlur` 无条件调用 `setCredential(account, value)`;当 `value === ''` 时后端会 remove 对应账号,最终 `credentials.json` 被写回空 provider。 - 已在 Windows 真机复现:手动写入本机凭据后,打开设置页仍显示空;随后凭据文件又变成 `providers.asr={}` / `providers.llm={}`。 - 相关文件:`openless -all/app/src/pages/Settings.tsx` 的 `CredentialField`。 ## 影响 - 用户已经配置好的 ASR/LLM 凭据会被设置页静默清空。 - 真实回归脚本会先显示凭据已配置,但打开应用后又变成未配置,导致录音/润色链路失败。 - 这会被误判为路径、Keychain 或后端读取问题,实际是前端表单生命周期覆盖。 ## 建议接受标准 - [ ] 凭据字段必须等 `readCredential()` 完成后才允许保存。 - [ ] 只有用户实际修改过字段才在 blur 时保存。 - [ ] 打开设置页但不修改字段,`credentials.json` 不发生变化。 - [ ] 读取失败时显示错误状态,不写空值覆盖已有凭据。 - [ ] 不在日志、UI、issue 中打印密钥明文。 ## TODO / 不确定项 - TODO:补 WebDriver/E2E 测试,断言打开设置页不会清空凭据。
现象
'',readCredential()异步返回前发生 blur,或旧窗口里空字段失焦。CredentialField.onBlur无条件调用setCredential(account, value);当value === ''时后端会 remove 对应账号,最终credentials.json被写回空 provider。providers.asr={}/providers.llm={}。openless -all/app/src/pages/Settings.tsx的CredentialField。影响
建议接受标准
readCredential()完成后才允许保存。credentials.json不发生变化。TODO / 不确定项