新增: 初始化 DevFlow 项目仓库

Tauri 2 + Vue 3 + Vite 6 桌面应用,Rust workspace 含 13 个 crate
(df-ai / df-storage / df-workflow / df-core / df-execute 等)。
核心能力:AI 聊天 agentic 循环(工具调用+人工审批)、工作流引擎、
任务/想法/项目/阶段管理、可追溯性,及配套前端组件。
This commit is contained in:
2026-06-12 01:31:05 +08:00
commit 98393b4908
178 changed files with 27859 additions and 0 deletions

View File

@@ -0,0 +1,87 @@
//! 节点注册表 — 根据 node_type 字符串创建节点实例
use std::collections::HashMap;
use crate::dag::Dag;
use crate::dag_def::DagDef;
use crate::node::Node;
/// 节点工厂函数类型
type NodeFactory = Box<dyn Fn(&serde_json::Value) -> Box<dyn Node> + Send + Sync>;
/// 节点注册表 — 根据 node_type 字符串创建节点实例
pub struct NodeRegistry {
factories: HashMap<String, NodeFactory>,
}
impl NodeRegistry {
/// 创建空的注册表
pub fn new() -> Self {
Self {
factories: HashMap::new(),
}
}
/// 注册一个节点工厂
pub fn register<F>(&mut self, type_name: &str, factory: F)
where
F: Fn(&serde_json::Value) -> Box<dyn Node> + Send + Sync + 'static,
{
self.factories.insert(type_name.to_string(), Box::new(factory));
}
/// 根据 node_type 创建节点实例
pub fn create(&self, type_name: &str, config: &serde_json::Value) -> anyhow::Result<Box<dyn Node>> {
self.factories
.get(type_name)
.ok_or_else(|| anyhow::anyhow!("未注册的节点类型: {}", type_name))
.map(|factory| factory(config))
}
/// 从 DagDef 构建完整的运行时 Dag
pub fn build_dag(&self, def: &DagDef) -> anyhow::Result<Dag> {
let mut dag = Dag::new();
// 创建所有节点实例
for (id, node_def) in &def.nodes {
let node = self.create(&node_def.node_type, &node_def.config)?;
dag.add_node(id.clone(), node);
}
// 添加所有边
for edge_def in &def.edges {
match &edge_def.condition {
Some(cond) => dag.add_edge_with_condition(
edge_def.source.clone(),
edge_def.target.clone(),
cond.clone(),
),
None => dag.add_edge(edge_def.source.clone(), edge_def.target.clone()),
}
}
Ok(dag)
}
/// 检查是否已注册指定类型
pub fn is_registered(&self, type_name: &str) -> bool {
self.factories.contains_key(type_name)
}
/// 列出所有已注册的节点类型
pub fn registered_types(&self) -> Vec<&str> {
self.factories.keys().map(|s| s.as_str()).collect()
}
}
impl Default for NodeRegistry {
fn default() -> Self {
let mut registry = Self::new();
registry.register("script", |_config| {
// ScriptNode 的工厂 — 需要 df-nodes 依赖后才可用
// 这里返回一个占位实现,实际项目中由 df-nodes crate 注册
unimplemented!("ScriptNode 需要通过 df-nodes 注册")
});
registry
}
}