# df-nodes 节点集合

> 创建: 2026-06-10 | 最后更新: 2026-08-08

---

## 概述

df-nodes 提供 DevFlow 工作流引擎的内置节点。所有节点实现 df-workflow 的 `Node` trait
(`execute` / `schema` / `node_type`),由 DAG Executor 按拓扑序驱动。

## 当前状态

10 个节点全部完整实现(`execute()` 非 stub,有真实逻辑 + 单测覆盖),另有 `task_state_machine`
(状态机)与 `task_workflow_templates`(流程模板)两个支撑模块。

## 节点清单

| 节点 | 功能 | 阻塞 | node_type | 实现状态 |
|------|------|------|-----------|---------|
| AiNode | 调用 LLM 完成文本生成/分析(非流式 complete) | 否 | `ai` | ✅ 完整 |
| AiSelfReviewNode | AI 对任务产出自审(复用 AiNode 调用链,verdict 闸门) | 否 | `ai_self_review` | ✅ 完整 |
| ScriptNode | Shell/脚本执行(白/黑名单安全策略) | 否 | `script` | ✅ 完整 |
| HumanNode | 人工审批/确认(单选/多选) | 是 | `human` | ✅ 完整 |
| TaskAdvanceNode | 任务状态推进链唯一 status 写入路径(状态机 + CAS) | 否 | `task_advance` | ✅ 完整 |
| GitNode | Git 操作(branch/checkout/commit/merge/push/status/log) | 否 | `git` | ✅ 完整 |
| HTTPNode | HTTP 请求(GET/POST/PUT/DELETE) | 否 | `http` | ✅ 完整 |
| NotifyNode | 通知(桌面日志 / webhook,尽力而为不阻断) | 否 | `notify` | ✅ 完整 |
| SubflowNode | 嵌套子工作流(返回子 DAG 快照,深度限制防递归) | 否 | `subflow` | ✅ 完整 |
| DockerNode | Docker 容器内执行命令(`docker run --rm`,环境检测+授权) | 否 | `docker` | ✅ 完整 |

## 节点详述

### AiNode（ai_node.rs）

工作流中无人值守的 AI 步骤：从节点 config 读取 OpenAI 兼容 / Anthropic 协议 provider 配置与 prompt，经 `df_ai::build_provider` 工厂选协议，调一次 LLM `complete()`（非流式），输出文本供下游消费。

- **参数解析**：`parse_params(config, inputs)` 与 `execute` 解耦（便于单测）。`prompt` 取值优先级：上游 `inputs["prompt"]` > `config.prompt`，两者皆无则报错。
- **必填**：`base_url` / `api_key`。空 `api_key` 早失败（避免空 key 吃 401 误报「Key 无效」）。
- **协议**：`protocol` 默认 `openai_compat`；`anthropic` 走 GLM 订阅 / Claude 官方。
- **model 兜底**：留空时 `default_model = "gpt-4o-mini"`，避免 provider 构造 panic。
- **输出**：`{ text, model, usage: {prompt_tokens, completion_tokens, total_tokens} }`。
- **与 AI Chat 区别**：AiNode 由 DAG Executor 自动驱动（嵌入自动化链路），非交互对话。

### AiSelfReviewNode（ai_self_review_node.rs）

AI 自审闭环节点：对 AiNode 产出的任务内容做二次 AI 审查，返回 `verdict`（通过/打回）闸门。
复用 AiNode 的 provider 调用链（`ai_node_helpers`），差异在 prompt 模板与 JSON 解析。

### ScriptNode（script_node.rs）

执行 Shell 脚本或自定义命令，复用 `df_execute::shell::execute`（跨平台：Windows `cmd /C` / Unix `sh -c`）。

- **必填**：`command`。
- **可选**：`timeout_secs`、`working_dir`。
- **安全策略**：命令名（首词）白/黑名单校验（运行时配置优先，回退环境变量 / 默认黑名单）；危险关键词仅告警不阻止。
- **失败语义**：非零退出码视为执行失败（`bail!` 带 exit_code + stderr）。
- **输出**：`{ stdout, stderr, exit_code, duration_ms }`。

### HumanNode（human_node.rs）

阻塞节点，订阅事件总线 → 发 `HumanApprovalRequest` → `select!` 轮询 `HumanApprovalResponse` / 超时 / 取消。

- **执行顺序**：先 `subscribe()` 再 `send(Request)`（broadcast 不回放，反序会丢 Response 死等到超时）；`send` 必须 `await`（否则 Future 不 poll、Request 不进 channel）。
- **审批模式**：`select_type` 缺省 `Single`，非 `"multiple"` 一律按 Single 处理。
  - Single → 决策数必须 = 1
  - Multiple → 决策数必须 ≥ 1
  - `options` 空 → 允许自由文本（仅受数量约束）；非空 → 每项必须 ∈ options
  - 兼容旧调用方：`decisions` 空但 `decision` 非空时按 `[decision]` 单值处理
- **非法决策不立即 Err**：warn 记录 + continue 续等下一条合法 Response（由超时兜底），避免一次手误杀死节点。
- **超时**：默认 3600s。
- **取消**：每 500ms tick 检查 `node_status.is_cancelled`。
- **输出**：`{ decision（首项，向后兼容）, decisions（数组）, comment }`。

### TaskAdvanceNode（task_advance_node.rs）

任务推进链的唯一 status 写入路径（与 IPC/AI 工具/MCP 同源）：读当前 TaskRecord → 状态机
`can_transition` 校验 → 原子写（下沉 SQL 防 TOCTOU），退回转换自动累加 `review_rounds`。

### GitNode（git_node.rs）

通过 `df_execute::shell::execute` 调用本地 git CLI，`working_dir` 指定仓库路径。
支持 branch / checkout / commit / merge / push / status / log，输出按 action 提取结构化字段。

### HTTPNode（http_node.rs）

使用 reqwest 发起 GET/POST/PUT/DELETE 请求。config 提供 `method/url/headers/body/timeout_secs`，
输出 `status_code + body + content_type`。

### NotifyNode（notify_node.rs）

桌面（当前为日志占位，后续接 tauri-plugin-notification）/ webhook 通知。语义：尽力而为，
通知失败不阻断工作流（输出 `success=false` 但仍 Ok 返回）。

### SubflowNode（subflow_node.rs）

加载一个子 DAG 并在当前执行上下文中递归执行（复用通用流程，如「代码审查」作为子步骤）。
返回子 DAG 的 JSON 快照供 DagExecutor 消费展开，`max_depth` 限制嵌套深度防无限递归。

### DockerNode（docker_node.rs）

通过 `docker run --rm` 一次性容器执行命令，复用 `df_execute::shell::execute` 调用本地 docker CLI。
含环境检测（本机是否有 docker）与授权校验。

## 文件结构

```
crates/df-nodes/src/
├── lib.rs                 — 模块入口（声明各 pub mod）
├── ai_node.rs             — AiNode（LLM 文本生成/分析）
├── ai_node_helpers.rs     — AiNode 纯逻辑（provider 解析/参数构造,非 Node）
├── ai_self_review_node.rs — AiSelfReviewNode（AI 自审）
├── script_node.rs         — ScriptNode（Shell 执行）
├── human_node.rs          — HumanNode（人工审批/确认,阻塞）
├── human_node_helpers.rs  — HumanNode 纯逻辑（拒绝语义判定,非 Node）
├── task_advance_node.rs   — TaskAdvanceNode（任务状态推进链）
├── task_state_machine.rs  — 任务状态机（can_transition 等,非 Node）
├── task_workflow_templates.rs — 流程模板（testing 等模板,非 Node）
├── git_node.rs            — GitNode（Git 操作）
├── http_node.rs           — HttpNode（HTTP 请求）
├── notify_node.rs         — NotifyNode（通知）
├── subflow_node.rs        — SubflowNode（嵌套子工作流）
└── docker_node.rs         — DockerNode（容器内执行）
```

## 依赖关系

```
df-workflow (Node trait / DagDef)
  ← df-nodes
    ← df-ai (AiNode/AiSelfReviewNode: build_provider / LlmProvider)
    ← df-execute (ScriptNode/GitNode/DockerNode: shell::execute)
    ← df-storage (TaskAdvanceNode: TaskRepo::advance_status_atomic)
    ← df-core / df-types (HumanNode: events::WorkflowEvent / SelectType)
```

## 相关文档

- [df-workflow 工作流引擎](./df-workflow-工作流引擎-2026-06-12.md)
- [df-ai AI 集成模块](./df-ai-AI集成模块-2026-06-12.md)
