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,