From 0bb96fc509cf620518cdfdc7c7088c45339535c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=9D=E5=B0=98?= <237809796@qq.com> Date: Sun, 14 Jun 2026 16:32:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D:=20B-03b-R6=20human=5Fnode?= =?UTF-8?q?=20send=20=E7=BC=BA=20await=20+=20R7=20=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E5=A5=91=E7=BA=A6=E5=A4=B1=E9=85=8D=EF=BC=88P0=20=E5=AE=A1?= =?UTF-8?q?=E6=89=B9=E9=93=BE=E6=96=AD=E8=A3=82=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit R6: human_node.rs:41 发 HumanApprovalRequest 缺 .await(async fn send 的 Future 被 let _ = 丢弃未 poll,Request 从未进 channel,审批链最上游断裂,B-03a 重写引入,7 单测不覆盖 Request 发出故漏) R7: project.ts:214 type 'HumanApprovalRequest'→'human_approval_request'(serde rename snake_case) + :215 payload.event.data→payload.event 扁平取字段(WorkflowEvent 无 data 包装) 来源: workflow-approval-review-2026-06-14.md §0/§1(31-agent 审查头号 P0);cargo/vue-tsc 0 err / df-nodes 14 test pass --- crates/df-nodes/src/human_node.rs | 17 ++++++++++------- src/stores/project.ts | 5 +++-- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/crates/df-nodes/src/human_node.rs b/crates/df-nodes/src/human_node.rs index c2fa11e..e1b0c51 100644 --- a/crates/df-nodes/src/human_node.rs +++ b/crates/df-nodes/src/human_node.rs @@ -38,13 +38,16 @@ impl Node for HumanNode { let mut rx = ctx.event_bus.subscribe(); // 2. 发送人工审批请求到事件总线 - let _ = ctx.event_bus.send(WorkflowEvent::HumanApprovalRequest { - execution_id: ctx.execution_id.clone(), - node_id: ctx.node_id.clone(), - title: title.to_string(), - description: description.to_string(), - options: options.clone(), - }); + // send 是 async fn(broadcast 同步发但 async 包装),必须 await 否则 Future 不 poll、Request 不进 channel(B-03b-R6) + let _ = ctx.event_bus + .send(WorkflowEvent::HumanApprovalRequest { + execution_id: ctx.execution_id.clone(), + node_id: ctx.node_id.clone(), + title: title.to_string(), + description: description.to_string(), + options: options.clone(), + }) + .await; // 3. select! 循环:Response / 超时 / 取消 let deadline = tokio::time::Instant::now() + Duration::from_secs(timeout_secs); diff --git a/src/stores/project.ts b/src/stores/project.ts index a52df9e..e6c6990 100644 --- a/src/stores/project.ts +++ b/src/stores/project.ts @@ -211,8 +211,9 @@ function createStore() { try { state.liveEvents.push(payload) // 处理人工审批请求 - if (payload.event?.type === 'HumanApprovalRequest') { - state.pendingApproval = payload.event.data as typeof state.pendingApproval + // WorkflowEvent serde tag=type rename_all=snake_case → type='human_approval_request',字段扁平(无 data 包装)(B-03b-R7) + if (payload.event?.type === 'human_approval_request') { + state.pendingApproval = payload.event as unknown as typeof state.pendingApproval } } catch (e) { console.error('处理工作流事件失败:', e, payload)