重构 API 路由并新增工作流编排功能

后端:
- 重构 agents, heartbeats, locks, meetings, resources, roles, workflows 路由
- 新增 orchestrator 和 providers 路由
- 新增 CLI 调用器和流程编排服务
- 添加日志配置和依赖项

前端:
- 更新 AgentsPage、SettingsPage、WorkflowPage 页面
- 扩展 api.ts 新增 API 接口

其他:
- 清理测试 agent 数据文件
- 新增示例工作流和项目审计报告

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Claude Code
2026-03-10 16:36:25 +08:00
parent 7a5a58b4e5
commit 1719d1f1f9
54 changed files with 3175 additions and 612 deletions

View File

@@ -1,9 +0,0 @@
{
"agent_id": "arch-001",
"name": "Architect",
"role": "architect",
"model": "claude-opus-4.6",
"description": "Architect - architect",
"created_at": "2026-03-09T17:23:06.837127",
"status": "idle"
}

View File

@@ -1,7 +0,0 @@
{
"agent_id": "arch-001",
"current_task": "",
"progress": 0,
"working_files": [],
"last_update": "2026-03-09T17:23:06.852720"
}

View File

@@ -0,0 +1,9 @@
{
"agent_id": "budget-opencode",
"name": "预算管家 (OpenCode)",
"role": "budget",
"model": "opencode",
"description": "用 OpenCode CLI 分析性价比和优惠",
"created_at": "2026-03-10T14:10:42.666836",
"status": "idle"
}

View File

@@ -0,0 +1,7 @@
{
"agent_id": "budget-opencode",
"current_task": "",
"progress": 0,
"working_files": [],
"last_update": "2026-03-10T14:10:42.669798"
}

View File

@@ -0,0 +1,9 @@
{
"agent_id": "chef-claude",
"name": "美食家 (Claude)",
"role": "chef",
"model": "claude",
"description": "用 Claude Code CLI 推荐美食方案",
"created_at": "2026-03-10T14:10:42.643341",
"status": "idle"
}

View File

@@ -0,0 +1,7 @@
{
"agent_id": "chef-claude",
"current_task": "",
"progress": 0,
"working_files": [],
"last_update": "2026-03-10T14:10:42.645912"
}

View File

@@ -1,9 +0,0 @@
{
"agent_id": "claude-001",
"name": "Claude Code",
"role": "architect",
"model": "claude-opus-4.6",
"description": "",
"created_at": "2026-03-05T10:17:03.114275",
"status": "idle"
}

View File

@@ -1,7 +0,0 @@
{
"agent_id": "claude-001",
"current_task": "fixing bug",
"progress": 68,
"working_files": [],
"last_update": "2026-03-05T10:17:06.914810"
}

View File

@@ -1,9 +0,0 @@
{
"agent_id": "dev-001",
"name": "Developer",
"role": "developer",
"model": "claude-sonnet-4.6",
"description": "Developer - developer",
"created_at": "2026-03-09T17:23:06.864073",
"status": "idle"
}

View File

@@ -1,7 +0,0 @@
{
"agent_id": "dev-001",
"current_task": "",
"progress": 0,
"working_files": [],
"last_update": "2026-03-09T17:23:06.867216"
}

View File

@@ -0,0 +1,9 @@
{
"agent_id": "health-kimi",
"name": "营养师 (Kimi)",
"role": "health",
"model": "kimi",
"description": "用 Kimi CLI 提供健康饮食建议",
"created_at": "2026-03-10T14:10:42.658959",
"status": "idle"
}

View File

@@ -0,0 +1,7 @@
{
"agent_id": "health-kimi",
"current_task": "",
"progress": 0,
"working_files": [],
"last_update": "2026-03-10T14:10:42.661356"
}

View File

@@ -1,9 +0,0 @@
{
"agent_id": "kimi-001",
"name": "Kimi CLI",
"role": "architect",
"model": "kimi-k2",
"description": "Kimi CLI - architect",
"created_at": "2026-03-09T18:23:33.409369",
"status": "idle"
}

View File

@@ -1,7 +0,0 @@
{
"agent_id": "kimi-001",
"current_task": "",
"progress": 0,
"working_files": [],
"last_update": "2026-03-09T18:23:33.413023"
}

View File

@@ -1,9 +0,0 @@
{
"agent_id": "kimi-002",
"name": "Kimi CLI",
"role": "pm",
"model": "moonshot-v1-8k",
"description": "",
"created_at": "2026-03-05T10:17:04.382854",
"status": "idle"
}

View File

@@ -1,7 +0,0 @@
{
"agent_id": "kimi-002",
"current_task": "",
"progress": 0,
"working_files": [],
"last_update": "2026-03-05T10:17:04.387780"
}

View File

@@ -1,9 +0,0 @@
{
"agent_id": "opencode-001",
"name": "OpenCode",
"role": "reviewer",
"model": "opencode-v1",
"description": "OpenCode - reviewer",
"created_at": "2026-03-09T18:23:34.314235",
"status": "idle"
}

View File

@@ -1,7 +0,0 @@
{
"agent_id": "opencode-001",
"current_task": "",
"progress": 0,
"working_files": [],
"last_update": "2026-03-09T18:23:34.317455"
}

View File

@@ -1,9 +0,0 @@
{
"agent_id": "qa-001",
"name": "QA Engineer",
"role": "qa",
"model": "claude-haiku-4.6",
"description": "QA Engineer - qa",
"created_at": "2026-03-09T17:23:06.877677",
"status": "idle"
}

View File

@@ -1,7 +0,0 @@
{
"agent_id": "qa-001",
"current_task": "",
"progress": 0,
"working_files": [],
"last_update": "2026-03-09T17:23:06.880737"
}

View File

@@ -1,9 +0,0 @@
{
"agent_id": "test-001",
"name": "Test Agent",
"role": "developer",
"model": "claude-sonnet-4.6",
"description": "Test Agent - developer",
"created_at": "2026-03-09T17:22:39.234290",
"status": "idle"
}

View File

@@ -1,7 +0,0 @@
{
"agent_id": "test-001",
"current_task": "",
"progress": 0,
"working_files": [],
"last_update": "2026-03-09T17:22:39.236368"
}

View File

@@ -1,9 +0,0 @@
{
"agent_id": "test-agent-001",
"name": "Test Agent",
"role": "developer",
"model": "claude-opus-4.6",
"description": "测试用的 Agent",
"created_at": "2026-03-09T09:28:05.266992",
"status": "idle"
}

View File

@@ -1,7 +0,0 @@
{
"agent_id": "test-agent-001",
"current_task": "修复 bug",
"progress": 75,
"working_files": [],
"last_update": "2026-03-09T09:28:05.280849"
}

View File

@@ -15,7 +15,7 @@
},
"agent-001": {
"agent_id": "agent-001",
"last_heartbeat": "2026-03-09T09:28:05.259883",
"last_heartbeat": "2026-03-10T09:46:01.524675",
"status": "working",
"current_task": "测试任务",
"progress": 50
@@ -61,5 +61,54 @@
"status": "idle",
"current_task": "",
"progress": 0
},
"test-api-001": {
"agent_id": "test-api-001",
"last_heartbeat": "2026-03-10T09:51:56.468836",
"status": "idle",
"current_task": "",
"progress": 100
},
"chef-001": {
"agent_id": "chef-001",
"last_heartbeat": "2026-03-10T14:01:11.073277",
"status": "idle",
"current_task": "",
"progress": 100
},
"health-001": {
"agent_id": "health-001",
"last_heartbeat": "2026-03-10T14:01:10.054540",
"status": "idle",
"current_task": "",
"progress": 100
},
"budget-001": {
"agent_id": "budget-001",
"last_heartbeat": "2026-03-10T14:01:10.399576",
"status": "idle",
"current_task": "",
"progress": 100
},
"chef-claude": {
"agent_id": "chef-claude",
"last_heartbeat": "2026-03-10T15:08:32.140273",
"status": "idle",
"current_task": "",
"progress": 100
},
"health-kimi": {
"agent_id": "health-kimi",
"last_heartbeat": "2026-03-10T15:06:31.463105",
"status": "idle",
"current_task": "",
"progress": 100
},
"budget-opencode": {
"agent_id": "budget-opencode",
"last_heartbeat": "2026-03-10T15:06:51.417016",
"status": "idle",
"current_task": "",
"progress": 100
}
}

View File

@@ -35,15 +35,16 @@
"meeting_id": "test-meeting-001",
"title": "测试会议",
"expected_attendees": [
"claude-001",
"kimi-001"
"agent-001",
"agent-002"
],
"arrived_attendees": [
"claude-001"
"agent-001",
"agent-002"
],
"status": "waiting",
"created_at": "2026-03-09T18:05:28.657165",
"started_at": "",
"status": "ended",
"created_at": "2026-03-10T09:46:01.575444",
"started_at": "2026-03-10T09:46:02.608852",
"min_required": 2
},
"meeting-001": {
@@ -79,5 +80,17 @@
"created_at": "2026-03-09T17:23:43.445453",
"started_at": "2026-03-09T17:23:43.501216",
"min_required": 3
},
"meeting-1773107507": {
"meeting_id": "meeting-1773107507",
"title": "API 测试会议",
"expected_attendees": [
"test-api-001"
],
"arrived_attendees": [],
"status": "ended",
"created_at": "2026-03-10T09:51:47.354477",
"started_at": "",
"min_required": 1
}
}

View File

@@ -0,0 +1,57 @@
{
"meeting_id": "dinner-proposals",
"title": "晚饭提议",
"date": "2026-03-10",
"attendees": [
"chef-claude",
"health-kimi",
"budget-opencode"
],
"steps": [
{
"step_id": "step_1",
"label": "提议",
"status": "completed",
"completed_at": "2026-03-10T15:05:07.995673"
},
{
"step_id": "step_2",
"label": "讨论",
"status": "pending",
"completed_at": ""
},
{
"step_id": "step_3",
"label": "共识",
"status": "completed",
"completed_at": "2026-03-10T15:05:27.690590"
}
],
"discussions": [
{
"agent_id": "chef-claude",
"agent_name": "美食家 (Claude)",
"content": "这是 **Swarm Command Center** 中「晚饭提议」工作流的模拟场景。\n\n## 场景说明\n\n在这个场景中多个 AI Agent 会扮演不同角色(大厨、健康顾问、预算管理员等)来讨论晚餐选择,最终达成共识。\n\n**讨论流程**\n1. **提议** - 各 Agent 依次发言2-3句话\n2. **讨论** - 记录到会议系统\n3. **共识** - 生成最终决议\n\n**角色设定**`workflow_orchestrator.py:108-141`\n- **chef**(美食达人)- 关注口味、食材\n- **health**(健康顾问)- 关注营养均衡\n- **budget**(预算管理)- 关注性价比\n- **pm**(产品经理)- 综合决策\n\n---\n\n你想做什么\n\n1. **启动工作流** - 运行完整的晚饭决策流程\n2. **查看运行状态** - 查看之前的编排结果\n3. **创建/修改工作流定义** - 编辑 `.doc/workflow/dinner-decision.yaml`\n4. **查看现有 Agent 状态** - 确认参与讨论的 Agent 是否已注册",
"timestamp": "2026-03-10T15:04:31.968972",
"step": "讨论"
},
{
"agent_id": "health-kimi",
"agent_name": "营养师 (Kimi)",
"content": "建议晚餐采用\"蔬菜占一半、蛋白质占四分之一、主食占四分之一\"的搭配原则,优先选择\n清蒸、炖煮等低油烹饪方式。控制总热量在500-700千卡之间避免高盐高糖的加工食品\n。如果有外卖计划请选择卫生评级B级以上的商家。",
"timestamp": "2026-03-10T15:04:48.638259",
"step": "讨论"
},
{
"agent_id": "budget-opencode",
"agent_name": "预算管家 (OpenCode)",
"content": "您好!请告诉我您希望我扮演什么角色,以及讨论的具体场景是什么?这样我才能给出合适的观点和建议。",
"timestamp": "2026-03-10T15:05:07.977497",
"step": "讨论"
}
],
"status": "completed",
"created_at": "2026-03-10T15:01:32.839808",
"ended_at": "2026-03-10T15:05:27.690584",
"consensus": "根据营养师的专业建议和讨论情况,晚餐共识如下:\n\n我们决定晚餐遵循\"蔬菜占一半、蛋白质占四分之一、主食占四分之一\"的健康搭配原则,\n优先采用清蒸、炖煮等低油烹饪方式将总热量控制在500-700千卡之间。如需外卖必\n须选择卫生评级B级以上的商家同时避免高盐高糖的加工食品。请按此标准准备或订购\n今晚的晚餐。"
}

View File

@@ -0,0 +1,69 @@
# 晚饭提议
**会议 ID**: dinner-proposals
**日期**: 2026-03-10
**状态**: completed
**参会者**: chef-claude, health-kimi, budget-opencode
## 会议进度
-**提议** (2026-03-10T15:05:07.995673)
-**讨论**
-**共识** (2026-03-10T15:05:27.690590)
## 讨论记录
### 美食家 (Claude) - 2026-03-10T15:04:31
*步骤: 讨论*
这是 **Swarm Command Center** 中「晚饭提议」工作流的模拟场景。
## 场景说明
在这个场景中,多个 AI Agent 会扮演不同角色(大厨、健康顾问、预算管理员等)来讨论晚餐选择,最终达成共识。
**讨论流程**
1. **提议** - 各 Agent 依次发言2-3句话
2. **讨论** - 记录到会议系统
3. **共识** - 生成最终决议
**角色设定**`workflow_orchestrator.py:108-141`
- **chef**(美食达人)- 关注口味、食材
- **health**(健康顾问)- 关注营养均衡
- **budget**(预算管理)- 关注性价比
- **pm**(产品经理)- 综合决策
---
你想做什么?
1. **启动工作流** - 运行完整的晚饭决策流程
2. **查看运行状态** - 查看之前的编排结果
3. **创建/修改工作流定义** - 编辑 `.doc/workflow/dinner-decision.yaml`
4. **查看现有 Agent 状态** - 确认参与讨论的 Agent 是否已注册
### 营养师 (Kimi) - 2026-03-10T15:04:48
*步骤: 讨论*
建议晚餐采用"蔬菜占一半、蛋白质占四分之一、主食占四分之一"的搭配原则,优先选择
清蒸、炖煮等低油烹饪方式。控制总热量在500-700千卡之间避免高盐高糖的加工食品
。如果有外卖计划请选择卫生评级B级以上的商家。
### 预算管家 (OpenCode) - 2026-03-10T15:05:07
*步骤: 讨论*
您好!请告诉我您希望我扮演什么角色,以及讨论的具体场景是什么?这样我才能给出合适的观点和建议。
## 共识
根据营养师的专业建议和讨论情况,晚餐共识如下:
我们决定晚餐遵循"蔬菜占一半、蛋白质占四分之一、主食占四分之一"的健康搭配原则,
优先采用清蒸、炖煮等低油烹饪方式将总热量控制在500-700千卡之间。如需外卖
须选择卫生评级B级以上的商家同时避免高盐高糖的加工食品。请按此标准准备或订购
今晚的晚餐。
---
**创建时间**: 2026-03-10T15:01:32.839808
**结束时间**: 2026-03-10T15:05:27.690584

View File

@@ -0,0 +1,57 @@
{
"meeting_id": "dinner-vote",
"title": "讨论与投票",
"date": "2026-03-10",
"attendees": [
"chef-claude",
"health-kimi",
"budget-opencode"
],
"steps": [
{
"step_id": "step_1",
"label": "提议",
"status": "completed",
"completed_at": "2026-03-10T15:06:51.426835"
},
{
"step_id": "step_2",
"label": "讨论",
"status": "pending",
"completed_at": ""
},
{
"step_id": "step_3",
"label": "共识",
"status": "completed",
"completed_at": "2026-03-10T15:07:36.101402"
}
],
"discussions": [
{
"agent_id": "chef-claude",
"agent_name": "美食家 (Claude)",
"content": "我无法直接访问 `.doc/` 目录中的会议和工作流数据。请帮我确认一下你的具体需求:\n\n**关于「讨论与投票」场景,你希望:**\n\n1. **创建一个新的会议** - 用于团队讨论和投票某个议题?\n2. **查看当前进行中的会议** - 是否有 ID 或名称?\n3. **在工作流中添加步骤** - 将「讨论与投票」作为工作流的一个阶段?\n4. **模拟/记录讨论内容** - 记录团队成员的讨论发言?\n\n如果是创建会议请提供\n- 会议主题/标题\n- 参与讨论的 Agent ID 列表claude-001, kimi-001\n- (可选)具体要讨论和投票的内容\n\n请告诉我具体想做什么我来协助你操作。",
"timestamp": "2026-03-10T15:06:13.624257",
"step": "讨论"
},
{
"agent_id": "health-kimi",
"agent_name": "营养师 (Kimi)",
"content": "作为营养师,我认可上一轮达成的\"蔬菜半盘、蛋白和主食各四分之一\"的餐盘比例共识,\n这是符合《中国居民膳食指南》的黄金搭配。清蒸和炖煮确实能最大程度保留营养并减少\n油脂摄入建议大家在点餐或烹饪前先用手机备忘录规划好食材比例避免临时决策导致\n热量超标。另外提醒一点外卖酱料包往往藏有隐形盐分尽量选择独立包装的酱料并只\n使用三分之一。",
"timestamp": "2026-03-10T15:06:31.458353",
"step": "讨论"
},
{
"agent_id": "budget-opencode",
"agent_name": "预算管家 (OpenCode)",
"content": "我明白了,但您还没有告诉我需要扮演什么角色以及讨论的场景是什么,请提供更多背景信息。",
"timestamp": "2026-03-10T15:06:51.411820",
"step": "讨论"
}
],
"status": "completed",
"created_at": "2026-03-10T15:05:27.693693",
"ended_at": "2026-03-10T15:07:36.101395",
"consensus": "根据讨论记录,各参与者对「讨论与投票」场景的理解尚未对齐:美食家询问具体需求方\n向营养师分享了健康饮食建议预算管家则表示未收到角色设定。显然讨论缺乏统一的\n场景背景和明确的议题目标。共识是需要先明确角色扮演场景、统一讨论主题并建立基\n本的沟通框架。下一步行动方案是由主持人重新定义场景和角色任务确保所有参与者\n围绕同一议题展开讨论然后再进行实质性交流和投票决策。"
}

View File

@@ -0,0 +1,60 @@
# 讨论与投票
**会议 ID**: dinner-vote
**日期**: 2026-03-10
**状态**: completed
**参会者**: chef-claude, health-kimi, budget-opencode
## 会议进度
-**提议** (2026-03-10T15:06:51.426835)
-**讨论**
-**共识** (2026-03-10T15:07:36.101402)
## 讨论记录
### 美食家 (Claude) - 2026-03-10T15:06:13
*步骤: 讨论*
我无法直接访问 `.doc/` 目录中的会议和工作流数据。请帮我确认一下你的具体需求:
**关于「讨论与投票」场景,你希望:**
1. **创建一个新的会议** - 用于团队讨论和投票某个议题?
2. **查看当前进行中的会议** - 是否有 ID 或名称?
3. **在工作流中添加步骤** - 将「讨论与投票」作为工作流的一个阶段?
4. **模拟/记录讨论内容** - 记录团队成员的讨论发言?
如果是创建会议,请提供:
- 会议主题/标题
- 参与讨论的 Agent ID 列表claude-001, kimi-001
- (可选)具体要讨论和投票的内容
请告诉我具体想做什么,我来协助你操作。
### 营养师 (Kimi) - 2026-03-10T15:06:31
*步骤: 讨论*
作为营养师,我认可上一轮达成的"蔬菜半盘、蛋白和主食各四分之一"的餐盘比例共识,
这是符合《中国居民膳食指南》的黄金搭配。清蒸和炖煮确实能最大程度保留营养并减少
油脂摄入,建议大家在点餐或烹饪前先用手机备忘录规划好食材比例,避免临时决策导致
热量超标。另外提醒一点,外卖酱料包往往藏有隐形盐分,尽量选择独立包装的酱料并只
使用三分之一。
### 预算管家 (OpenCode) - 2026-03-10T15:06:51
*步骤: 讨论*
我明白了,但您还没有告诉我需要扮演什么角色以及讨论的场景是什么,请提供更多背景信息。
## 共识
根据讨论记录,各参与者对「讨论与投票」场景的理解尚未对齐:美食家询问具体需求方
向,营养师分享了健康饮食建议,预算管家则表示未收到角色设定。显然讨论缺乏统一的
场景背景和明确的议题目标。共识是需要先明确角色扮演场景、统一讨论主题,并建立基
本的沟通框架。下一步行动方案是:由主持人重新定义场景和角色任务,确保所有参与者
围绕同一议题展开讨论,然后再进行实质性交流和投票决策。
---
**创建时间**: 2026-03-10T15:05:27.693693
**结束时间**: 2026-03-10T15:07:36.101395

View File

@@ -0,0 +1,41 @@
{
"meeting_id": "meeting-1773107507",
"title": "API 测试会议",
"date": "2026-03-10",
"attendees": [
"test-api-001"
],
"steps": [
{
"step_id": "step_1",
"label": "讨论",
"status": "completed",
"completed_at": "2026-03-10T09:51:52.976775"
},
{
"step_id": "step_2",
"label": "决策",
"status": "pending",
"completed_at": ""
},
{
"step_id": "step_3",
"label": "总结",
"status": "pending",
"completed_at": ""
}
],
"discussions": [
{
"agent_id": "test-api-001",
"agent_name": "Test Agent",
"content": "这是一条测试讨论",
"timestamp": "2026-03-10T09:51:50.702079",
"step": "讨论"
}
],
"status": "completed",
"created_at": "2026-03-10T09:51:47.358700",
"ended_at": "2026-03-10T09:51:52.976766",
"consensus": "测试共识"
}

View File

@@ -0,0 +1,28 @@
# API 测试会议
**会议 ID**: meeting-1773107507
**日期**: 2026-03-10
**状态**: completed
**参会者**: test-api-001
## 会议进度
-**讨论** (2026-03-10T09:51:52.976775)
-**决策**
-**总结**
## 讨论记录
### Test Agent - 2026-03-10T09:51:50
*步骤: 讨论*
这是一条测试讨论
## 共识
测试共识
---
**创建时间**: 2026-03-10T09:51:47.358700
**结束时间**: 2026-03-10T09:51:52.976766

View File

@@ -0,0 +1,49 @@
{
"meeting_id": "test-record-001",
"title": "测试记录会议",
"date": "2026-03-10",
"attendees": [
"agent-001",
"agent-002"
],
"steps": [
{
"step_id": "step_1",
"label": "步骤1",
"status": "completed",
"completed_at": "2026-03-10T09:46:02.676469"
},
{
"step_id": "step_2",
"label": "步骤2",
"status": "pending",
"completed_at": ""
},
{
"step_id": "step_3",
"label": "步骤3",
"status": "pending",
"completed_at": ""
}
],
"discussions": [
{
"agent_id": "agent-001",
"agent_name": "Agent1",
"content": "这是第一条讨论",
"timestamp": "2026-03-10T09:46:02.643824",
"step": ""
},
{
"agent_id": "agent-002",
"agent_name": "Agent2",
"content": "这是第二条讨论",
"timestamp": "2026-03-10T09:46:02.654028",
"step": ""
}
],
"status": "completed",
"created_at": "2026-03-10T09:46:02.633420",
"ended_at": "2026-03-10T09:46:02.676459",
"consensus": "达成共识:继续开发"
}

View File

@@ -0,0 +1,31 @@
# 测试记录会议
**会议 ID**: test-record-001
**日期**: 2026-03-10
**状态**: completed
**参会者**: agent-001, agent-002
## 会议进度
-**步骤1** (2026-03-10T09:46:02.676469)
-**步骤2**
-**步骤3**
## 讨论记录
### Agent1 - 2026-03-10T09:46:02
这是第一条讨论
### Agent2 - 2026-03-10T09:46:02
这是第二条讨论
## 共识
达成共识:继续开发
---
**创建时间**: 2026-03-10T09:46:02.633420
**结束时间**: 2026-03-10T09:46:02.676459

View File

@@ -0,0 +1,28 @@
# 晚饭决定工作流
# 多个 Agent 通过真实 AI CLI 协作讨论今晚吃什么
workflow_id: "dinner-decision"
name: "晚饭决定"
description: "团队协作决定今晚吃什么,通过 Claude/Kimi/OpenCode CLI 进行真实 AI 讨论"
meetings:
# 1. 提议阶段 - 每个 Agent 用不同 CLI 提出晚饭建议
- meeting_id: "dinner-proposals"
title: "晚饭提议"
node_type: "meeting"
attendees: ["chef-claude", "health-kimi", "budget-opencode"]
depends_on: []
# 2. 讨论与投票 - 综合讨论,达成共识
- meeting_id: "dinner-vote"
title: "讨论与投票"
node_type: "meeting"
attendees: ["chef-claude", "health-kimi", "budget-opencode"]
depends_on: ["dinner-proposals"]
# 3. 执行 - 确定最终方案
- meeting_id: "dinner-order"
title: "下单准备"
node_type: "execution"
attendees: ["chef-claude"]
min_required: 1
depends_on: ["dinner-vote"]