From 71e548aafc227661f8787e047ad8ca8e227006d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=9D=E5=B0=98?= <237809796@qq.com> Date: Tue, 6 Oct 2026 12:40:27 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D:=20=E9=A3=9E=E4=B9=A6?= =?UTF-8?q?=E6=B8=A0=E9=81=93=E9=94=99=E8=AF=AF=E8=AF=9D=E6=9C=AF=E5=88=86?= =?UTF-8?q?=E7=B1=BB=E9=80=8F=E4=BC=A0+=E6=8E=A2=E6=B4=BB=20inflight=20?= =?UTF-8?q?=E5=8F=A3=E5=BE=84=E5=89=8D=E7=A7=BB(18)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/todo.md | 2 +- src-tauri/src/feishu_channel.rs | 22 ++++++++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/docs/todo.md b/docs/todo.md index ca6e632..7deb17e 100644 --- a/docs/todo.md +++ b/docs/todo.md @@ -1033,7 +1033,7 @@ graph TD > **桌面端能力同步清单**(与渠道对齐,2026-10-06):16 纠偏注入做在 AiSession 会话层桌面天然受益;13 过程流式桌面过程视图同步对齐;14 任务卡+系统通知已在升级注记;另两件桌面专属:①V49 可恢复入口——走查实锤 list_parked 读侧零消费,桌面侧栏补「可恢复」列表消费它(断点续跑闭环最后一块) ②缺陷9 会话标题泄漏桌面同症随批修。 17. [ ] **桌面会话内容同步飞书**(同会话,2026-10-06 凌晨拍板):绑定飞书 chat 的 conv(chat_map 映射既有,恢复机制在)——桌面端该 conv 的新消息(user/assistant)实时投影飞书卡片,用户离机后手机飞书可跟任务全程。实现:订阅 ai_event_bus 的 conv 内容事件→飞书投影,与 13 过程流式/14 任务卡共用单写卡者;按决策价值过滤防刷屏(完整历史在桌面,飞书给关键节点)。与 14 组合即完整闭环:桌面发任务→切走→手机看过程→收结果。验收:桌面 conv 发消息/收回复,绑定飞书 3s 内卡片更新关键节点。 -18. [ ] **渠道错误话术吞因**(09:51 实证):spawn 被并发护栏拒绝时,飞书侧包装成「❌ 会话启动失败,请稍后重试」——真实原因「AI 正在生成中」被吞,用户误判 bot 坏了重试白撞。修:spawn Err 透传分类(生成中→「任务进行中,完成后自动处理」+受理排队选项;真失败→原因)。附带:探活告警口径 bug——任务在跑(inflight>0)却报「无在途会话」,inflight 计数未覆盖 spawn→回复窗口,修正计数点。验收:同场景复测,飞书提示真实状态。 +18. [x] **渠道错误话术吞因**(09:51 实证)✅ 2026-10-06 修复:①spawn Err 分类话术——并发护栏拒绝(「正在生成」)→「⏳ 该会话已有任务进行中,本条将在任务完成后处理;可稍后重发,或先 /status 查看进度」;其余失败→附截断原始原因(不吞因)。②探活告警口径修正——inflight 计数点从 spawn 前提前到 handle_message 白名单通过处(RAII 覆盖占位卡 HTTP+per-chat 锁排队窗口,原该窗口任务在跑却报「无在途会话」);旧计数点删除防双重计数。验收:cargo check EXIT 0 + feishu 7 passed。 > 附:09:48 桌面纠偏「不是 haogame 是 redtimer」被运行中 loop 下一轮直接接住——16 纠偏注入的桌面形态天然存在,飞书侧对齐即可。 ## 工作流治理升级(2026-10-06 用户拍板:根本性增强,源自提交质量检查三不达标) diff --git a/src-tauri/src/feishu_channel.rs b/src-tauri/src/feishu_channel.rs index 0f41493..bd1defe 100644 --- a/src-tauri/src/feishu_channel.rs +++ b/src-tauri/src/feishu_channel.rs @@ -254,6 +254,13 @@ async fn handle_message( .and_then(|u| u.open_id.clone()) .unwrap_or_default(); + // 18 探活口径修正:inflight 计数从此(白名单通过即受理)覆盖到投递完成——原计数点 + // 在 spawn 前,占位卡 HTTP+per-chat 锁排队(可等上一任务全程)不在覆盖内,该窗口 + // 连接假活会误报「无在途会话」。全部早退路径(占位卡失败/注入旁路/常规路径后续 + // return)经 RAII 回落,纯过滤段(@/空文本/白名单拒)在计数点之前不受影响。 + ctx.inflight.fetch_add(1, Ordering::SeqCst); + let _inflight_guard = InflightGuard(ctx.inflight.clone()); + // 白名单(D2 热加载):空=放行;非空且不在内 → 提示并附自己的 open_id(首启自助回填, // 免翻日志)。每消息现读 KV,设置面板改白名单即生效免重启 let whitelist = read_whitelist(&ctx).await; @@ -312,9 +319,8 @@ async fn handle_message( }; feishu_log(&format!("spawn 会话 conv={conv_id}")); - // D3 在途计数:从此到投递完成期间连接假活判定须让位,RAII 保任意退出路径回落 - ctx.inflight.fetch_add(1, Ordering::SeqCst); - let _inflight_guard = InflightGuard(ctx.inflight.clone()); + // D3 在途计数已前移至 handle_message 白名单通过处(探活口径修正,18),此处不再重复计数 + let state = ctx.app.state::(); // 通知桥注册(#14):oneshot 接收端有意 drop——两段式下终版走事件广播 // (deliver_completion_report_if_waited 的 AiAgentFinished publish),桥条目存在的 @@ -367,12 +373,20 @@ async fn handle_message( drop(deliver_tx); let _ = stream_task.await; feishu_log(&format!("spawn 失败 conv={conv_id}: {e}")); + // 18 渠道错误话术透传:并发护栏拒绝(生成中)≠真失败——固定「启动失败」话术 + // 吞掉真实原因,用户误判 bot 坏了重试白撞。按引擎层错误文案分类: + // 生成中→明示任务进行中不会丢;其余→附截断原始原因(不吞因)。 + let user_msg = if e.contains("正在生成") || e.contains("生成中") { + "⏳ 该会话已有任务进行中,本条将在任务完成后处理;可稍后重发,或先 /status 查看进度。".to_string() + } else { + format!("❌ 会话启动失败:{}`,请稍后重试", truncate(&e, 120)) + }; deliver_result( &ctx.client, &placeholder_id, &message_id, &chat_id, - "❌ 会话启动失败,请稍后重试", + &user_msg, ) .await; return;