# 信风（TradeWind）— 工作流

信风是多 Agent 协作工作流引擎。通过可视化画布编排节点和有向边，构建结构化的上下游Agent协作。

## 一、核心概念

### 节点类型

| 节点 | 说明 |
|------|------|
| **Entry** | 入口节点，定义工作流输入内容 |
| **Agent** | 工作 Agent，执行 ReAct 循环完成任务 |
| **Meeting** | 会议室，多个 Agent 圆桌讨论 + 会长纪要 |
| **Output** | 输出节点，收集上游结果并汇总输出 |
| **Note** | 编译期静态注入，追加到下游 Agent 的 system prompt |

### 边（Edge）

边连接节点，定义数据流向。Agent 节点处理完后将结果传递给下游。

### 信封（Handoff）

Agent 完成任务后向下游节点发送「信封」，包含完整消息历史。下游 Agent 以此作为上下文继续工作。

## 二、画布操作

### 添加节点
- **工具箱**：左侧面板拖入或点击添加节点
- **右键菜单**：画布空白处右键添加


### 连接节点
从节点底部的 Handle 拖出连线到目标节点顶部 Handle。

### 配置节点
选中节点后，右侧弹出配置面板：
- **Agent 节点**：选择 Agent、填写备注、以及节点显示名称
- **Meeting 节点**：配置议题、会长（Agent 实体）、参与者（画布上已有的 Agent 节点）
- **Entry 节点**：可以填入初始信封内容，跟随流传进入下游节点
- **Note 节点**：填写后可以注入agent节点作为引导，不可链接会议室节点，可以完全独立（不连接任意节点），充当工作流额外备注。

### 右键菜单
- 节点右键：编辑 / 克隆 / 删除
- **右键连线**：会提示是否删除连线（右键连线可以显式删除已经有的连线）

## 三、保存与加载

1. **工作流列表**：左侧面板管理所有工作流
2. 点击保存 → 写入 `data/tradewind/workflows/{id}/graph.json`
3. 工作流格式为 WorkflowGraph（nodes + edges）
4. 示例工作流随仓库分发

## 四、运行工作流

1. 顶部工具栏点击 **▶ 运行**
2. 启动前自动校验：
   - **Entry 节点必须存在（允许Entry节点）**
   - **Output 节点必须存在（Output节点校验只能存在一个，防止工作流意外中止）**
   - 无环（DAG 检测）
   - 所有边合法
3. 运行后画布节点显示实时状态：
   - 蓝色闪烁 = 节点正在执行
   - 琥珀色 = 信封在当前节点流转

## 五、停止工作流

- 运行中按钮切换为 ■ 停止
- 停止会中断所有进行中的 LLM 调用和工具执行

## 六、Agent 节点详情

### 执行模式

Agent 进入 ReAct 循环：
1. 接收上游信封（Handoff 消息）
2. 调用 LLM → 解析 `<action>` 或 `<answer>`
3. 执行工具 → 观察 `<result>`
4. 循环直到输出 `<answer>` 或达到轮次上限

### 流式会话

- 运行中点击 Agent 节点下方按钮可查看实时对话
- 会话保留到下一次工作流启动

### Sub-Agent 派发

Agent节点内Agent 可类似季风对话般调用 `spawn_sub_agents` 派发子 Agent 执行并行子任务。每个子 Agent 独立 ReAct 循环，结果汇总到母 Agent。

## 七、Meeting 节点详情

### 会议面板
- 点击 Meeting 节点的会标按钮打开面板
- 左侧：公共会议消息流 + 输入框 + 结束按钮
- 右侧：会长私聊频道
- 工具调用折叠展示

### 联络 Agent 节点

会议中的参与者可以通过 contact 工具联络工作流中其他正在运行的 Agent 节点：
- 用于将讨论结论同步给执行者，或向执行者索取最新进展
- 联络过程在会议面板中以工具调用卡片形式展示
- 对方 Agent 节点会完整处理消息（可使用工具），返回结论
- 被联络的 Agent 节点面板中也能看到完整处理过程

### 流式输出
- 参与者发言逐字推送
- 会长纪要流式生成

## 八、数据目录

```
data/tradewind/
├── workflows/          ← 工作流定义
│   └── {id}/
│       ├── graph.json  ← 节点和边
│       └── meta.json   ← 名称、时间
└── runs/               ← 运行记录
    └── {wfId}/
        └── {execId}/
            ├── events.jsonl
            ├── nodes/
            │   └── {nodeId}/
            │       └── messages.json
            └── output.json
```
