From 95edf8943b8e78788787db2840ecf1dc688959fb Mon Sep 17 00:00:00 2001 From: bigsong <35025755+bigsongeth@users.noreply.github.com> Date: Sun, 2 Aug 2026 11:53:01 +0800 Subject: [PATCH] =?UTF-8?q?fix(capsule):=20=E6=B6=A6=E8=89=B2/=E6=8F=92?= =?UTF-8?q?=E5=85=A5=E5=A4=B1=E8=B4=A5=E6=94=B9=E8=B5=B0=20error=20?= =?UTF-8?q?=E6=80=81=E2=80=94=E2=80=94=E5=A4=B1=E8=B4=A5=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E4=B8=8D=E5=86=8D=E8=A2=AB=E5=89=8D=E7=AB=AF=E4=B8=A2=E6=8E=89?= =?UTF-8?q?=20(#874)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 胶囊只在 error 态渲染 message,done 态按设计是「冻结光效淡出、不带文字」 (Capsule.tsx 的 VoiceOrbStage:`state === 'error' && {message}`)。 但 end_session 无论成败都发 CapsuleState::Done。于是 default_done_message 辛辛苦苦拼出来的失败文案,全部在前端被丢弃——算了、传了、不显示。 最典型的受害者是润色失败。它会静默回退成未润色的原文,而胶囊照常显示成功态, 界面上没有任何痕迹。实测后果:LLM 凭证失效后连着十几个小时每一句都在拿原文, 用户只能靠「今天出来的字怎么变笨了」察觉,而日志里其实每一句都 ERROR 了。 default_done_message 的注释写着「polish 失败优先告知用户」——意图是对的, 只是这句话从来没能显示出来。 改成按结果选状态:润色失败 / 插入失败 / TSF 未上屏走 error 态,成功仍走 done。 文案生成逻辑一行没动,只改用哪个状态发出去。 Co-authored-by: Claude Fable 5 --- .../app/src-tauri/src/coordinator/dictation.rs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/openless-all/app/src-tauri/src/coordinator/dictation.rs b/openless-all/app/src-tauri/src/coordinator/dictation.rs index 7dacb61a..89bb3fe4 100644 --- a/openless-all/app/src-tauri/src/coordinator/dictation.rs +++ b/openless-all/app/src-tauri/src/coordinator/dictation.rs @@ -3794,9 +3794,24 @@ pub(super) async fn end_session(inner: &Arc) -> Result<(), String> { default_done_message(status, polish_error.is_some()) }; + // 胶囊只在 error 态渲染 message —— done 态按设计是「冻结光效淡出、不带文字」 + // (见 Capsule.tsx 的 VoiceOrbStage:`state === 'error' && {message}`)。 + // 所以失败信息必须走 error 态才看得见,否则文案算出来就被前端丢掉。 + // + // 最典型的受害者是润色失败:它会静默回退成未润色的原文,而胶囊照常显示成功态, + // 用户界面上没有任何痕迹。实际后果是 LLM 凭证失效后,用户连着十几个小时每句话 + // 都在拿原文,只能靠「今天出来的字怎么变笨了」察觉,日志里其实每一句都报了错。 + let session_failed = + tsf_required_insert_failed || polish_error.is_some() || status == InsertStatus::Failed; + let capsule_state = if session_failed { + CapsuleState::Error + } else { + CapsuleState::Done + }; + emit_capsule( inner, - CapsuleState::Done, + capsule_state, 0.0, elapsed, done_message,