Files
DevFlow/crates/df-core/src/events.rs

106 lines
2.9 KiB
Rust

//! 工作流事件定义
use serde::{Deserialize, Serialize};
use crate::types::NodeId;
/// 人工审批选择类型(F-260615-01)
/// - Single: 单选(decision 单值),缺省值,向后兼容现有调用方
/// - Multiple: 多选(decisions 数组)
///
/// serde rename_all="snake_case" → "single"/"multiple"
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "snake_case")]
pub enum SelectType {
#[default]
Single,
Multiple,
}
/// 人工审批响应
///
/// 兼容字段(decision 单值):仅 select_type=Single 时使用;
/// 新字段 decisions 数组:Single 时长度=1,Multiple 时长度≥1。
/// 旧调用方仍可只填 decision,HumanNode 下游兼容两者。
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HumanApprovalResponse {
pub execution_id: String,
pub node_id: NodeId,
pub decision: String,
#[serde(default)]
pub decisions: Vec<String>,
pub comment: Option<String>,
}
/// 工作流事件
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum WorkflowEvent {
/// 节点开始执行
NodeStarted {
node_id: NodeId,
},
/// 节点执行进度更新
NodeProgress {
node_id: NodeId,
progress: f32,
message: String,
},
/// 节点产生输出
NodeOutput {
node_id: NodeId,
output: String,
},
/// 节点执行完成
NodeCompleted {
node_id: NodeId,
duration_ms: u64,
},
/// 节点执行失败
NodeFailed {
node_id: NodeId,
error: String,
},
/// 节点执行被取消(如 HumanNode 人工审批取消:set_cancelled 后节点返回 Err,
/// 状态保 Cancelled 终态)。语义有别于 NodeFailed(失败):取消是用户主动行为,
/// 前端按取消归「取消」展示,不应归类「失败」。
NodeCancelled {
node_id: NodeId,
},
/// 工作流暂停(等待外部输入)
WorkflowPaused {
reason: String,
waiting_node: NodeId,
},
/// 工作流执行完成
WorkflowCompleted {
total_duration_ms: u64,
},
/// 工作流执行失败
WorkflowFailed {
error: String,
failed_node: NodeId,
},
/// 人工审批请求
HumanApprovalRequest {
execution_id: String,
node_id: NodeId,
title: String,
description: String,
options: Vec<String>,
/// F-260615-01: 选择类型,缺省 Single(向后兼容)
#[serde(default)]
select_type: SelectType,
},
/// 人工审批响应
HumanApprovalResponse {
execution_id: String,
node_id: NodeId,
decision: String,
/// F-260615-01: 多选结果(Single 模式长度=1,Multiple 模式长度≥1)
#[serde(default)]
decisions: Vec<String>,
comment: Option<String>,
},
}