Commit f1ece95158929aa29a32e66330992887f610396c
1 parent
ce4b2bbc
docs: add Company Layer architecture design (24)
Showing
1 changed file
with
379 additions
and
0 deletions
docs/system-design/24-company-layer-architecture.md
0 → 100644
| 1 | +# 24. Company Layer — 公司实例化架构 | |
| 2 | + | |
| 3 | +> **版本**: v1.0 (需求分析 & 设计稿) | |
| 4 | +> **日期**: 2026-03-25 | |
| 5 | +> **状态**: 规划中 | |
| 6 | +> **前置**: 四层 Agent 架构 (02 号文档)、OKR 目标体系、Memory 系统、Heartbeat 系统 | |
| 7 | + | |
| 8 | +--- | |
| 9 | + | |
| 10 | +## 一、核心问题 | |
| 11 | + | |
| 12 | +### 当前架构的瓶颈 | |
| 13 | + | |
| 14 | +现有的 LemonBoss 采用**扁平化的单公司模型**: | |
| 15 | + | |
| 16 | +``` | |
| 17 | +data/agents/ | |
| 18 | +├── master ← 用户唯一的交互入口 | |
| 19 | +├── ceo ← 单一 CEO | |
| 20 | +├── qa-judge ← 单一 QA | |
| 21 | +├── poet ← 扁平挂在全局下 | |
| 22 | +├── innovator ← 扁平挂在全局下 | |
| 23 | +└── ... | |
| 24 | +``` | |
| 25 | + | |
| 26 | +**问题:** | |
| 27 | +1. **耦合**:所有 Agent 共存于同一个 `data/agents/` 目录,无法区分"做自媒体的编辑"和"做游戏的编辑"。 | |
| 28 | +2. **CEO 单例**:只有一个 CEO,如果同时要经营两家公司(自媒体 + 漫剧),CEO 要同时管两条完全不同的业务线,OKR 冲突、记忆污染。 | |
| 29 | +3. **无法独立闭环**:没有"公司"这个边界,Agent 无法形成一个可以 24 小时自主运转、独立迭代的闭合体。 | |
| 30 | +4. **无法并行扩展**:用户想创建第二家、第三家公司时,只能不断往同一个池里加人,而非开辟独立的组织空间。 | |
| 31 | + | |
| 32 | +### 设计目标 | |
| 33 | + | |
| 34 | +用户对 Master 说:**"帮我创建一家做公众号运营的公司"**,系统应该: | |
| 35 | +1. 创建一个独立的 **Company 实例**(如 `wechat-media-co`) | |
| 36 | +2. 为该公司分配(或新建)一个 **CEO Agent** | |
| 37 | +3. CEO 自主规划战略、定义 SOP、创建所需的 Role Agent | |
| 38 | +4. 公司内部形成**独立闭环**:从内容策划 → 创作 → 审核 → 发布 → 数据回收 → 策略调整 | |
| 39 | +5. 用户后续再说"帮我创建一家做漫剧的公司",系统创建第二个完全隔离的 Company 实例 | |
| 40 | + | |
| 41 | +--- | |
| 42 | + | |
| 43 | +## 二、架构演进:从扁平到层级 | |
| 44 | + | |
| 45 | +### 2.1 演进前 vs 演进后 | |
| 46 | + | |
| 47 | +``` | |
| 48 | + 【演进前】扁平模型 【演进后】Company 模型 | |
| 49 | + ───────────────── ────────────────────── | |
| 50 | + | |
| 51 | + User (你) User (你) | |
| 52 | + │ │ | |
| 53 | + └── Master └── Master (唯一, 全局) | |
| 54 | + │ │ | |
| 55 | + ├── CEO ├── Company: 自媒体公司 | |
| 56 | + ├── qa-judge │ ├── CEO (该公司专属) | |
| 57 | + ├── poet │ ├── qa-judge | |
| 58 | + ├── innovator │ ├── content-writer | |
| 59 | + └── ... │ ├── editor | |
| 60 | + │ ├── publisher | |
| 61 | + (所有人在同一个池子) │ └── data-analyst | |
| 62 | + │ | |
| 63 | + ├── Company: 漫剧工作室 | |
| 64 | + │ ├── CEO (另一个专属) | |
| 65 | + │ ├── scriptwriter | |
| 66 | + │ ├── artist | |
| 67 | + │ └── ... | |
| 68 | + │ | |
| 69 | + └── 全局 Agent (跨公司复用) | |
| 70 | + ├── innovator | |
| 71 | + └── agent-creator | |
| 72 | +``` | |
| 73 | + | |
| 74 | +### 2.2 核心原则 | |
| 75 | + | |
| 76 | +| 原则 | 说明 | | |
| 77 | +|------|------| | |
| 78 | +| **Master 是老板,不是 CEO** | Master 只管"开公司"和"战略校准",不深入执行 | | |
| 79 | +| **Company 是隔离边界** | 每家公司有独立的 Agent 池、OKR 树、Memory 空间 | | |
| 80 | +| **CEO 是公司的内核** | 公司创建后,CEO 是第一个被雇佣的人,由 CEO 自主规划一切 | | |
| 81 | +| **独立闭环运行** | 一个 Company 从创建到运营,不依赖人类持续干预 | | |
| 82 | +| **多实例并行** | 多个 Company 并行运转,互不干扰 | | |
| 83 | + | |
| 84 | +--- | |
| 85 | + | |
| 86 | +## 三、数据结构设计 | |
| 87 | + | |
| 88 | +### 3.1 目录结构 | |
| 89 | + | |
| 90 | +``` | |
| 91 | +data/ | |
| 92 | +├── agents/ ← 全局 Agent(Master + 跨公司工具类 Agent) | |
| 93 | +│ ├── master/ | |
| 94 | +│ ├── agent-creator/ | |
| 95 | +│ └── innovator/ | |
| 96 | +│ | |
| 97 | +├── companies/ ← 📦 新增:公司实例目录 | |
| 98 | +│ ├── wechat-media-co/ ← 公司实例 1 | |
| 99 | +│ │ ├── company.json ← 公司元数据 | |
| 100 | +│ │ ├── sop.md ← 公司 SOP(运营标准流程) | |
| 101 | +│ │ ├── agents/ ← 该公司的专属 Agent 池 | |
| 102 | +│ │ │ ├── ceo/ | |
| 103 | +│ │ │ ├── content-writer/ | |
| 104 | +│ │ │ ├── editor/ | |
| 105 | +│ │ │ ├── publisher/ | |
| 106 | +│ │ │ └── data-analyst/ | |
| 107 | +│ │ ├── goals/ ← 该公司的 OKR 树 | |
| 108 | +│ │ │ └── G-001/ | |
| 109 | +│ │ ├── pipelines/ ← 该公司的 SOP 流水线定义 | |
| 110 | +│ │ │ └── daily-content.json | |
| 111 | +│ │ └── workspace/ ← 该公司的共享工作区 | |
| 112 | +│ │ ├── content/ | |
| 113 | +│ │ └── assets/ | |
| 114 | +│ │ | |
| 115 | +│ └── manga-studio/ ← 公司实例 2 | |
| 116 | +│ ├── company.json | |
| 117 | +│ ├── agents/ | |
| 118 | +│ ├── goals/ | |
| 119 | +│ └── ... | |
| 120 | +│ | |
| 121 | +└── goals/ ← 全局 OKR (跨公司的顶层战略目标) | |
| 122 | +``` | |
| 123 | + | |
| 124 | +### 3.2 company.json 结构 | |
| 125 | + | |
| 126 | +```json | |
| 127 | +{ | |
| 128 | + "id": "wechat-media-co", | |
| 129 | + "name": "柠檬自媒体", | |
| 130 | + "description": "专注微信公众号内容运营,以 AI 驱动的内容工厂模式实现日更", | |
| 131 | + "status": "running", | |
| 132 | + "createdAt": "2026-03-25T17:00:00Z", | |
| 133 | + "createdBy": "master", | |
| 134 | + | |
| 135 | + "ceo": "ceo-wechat", | |
| 136 | + | |
| 137 | + "sop": { | |
| 138 | + "pipeline": "daily-content", | |
| 139 | + "description": "选题 → 写稿 → 审核 → 排版 → 发布 → 数据回收" | |
| 140 | + }, | |
| 141 | + | |
| 142 | + "agents": [ | |
| 143 | + "ceo-wechat", | |
| 144 | + "content-writer-01", | |
| 145 | + "editor-01", | |
| 146 | + "publisher-01", | |
| 147 | + "data-analyst-01" | |
| 148 | + ], | |
| 149 | + | |
| 150 | + "heartbeat": { | |
| 151 | + "enabled": true, | |
| 152 | + "intervalMinutes": 30 | |
| 153 | + }, | |
| 154 | + | |
| 155 | + "config": { | |
| 156 | + "timezone": "Asia/Shanghai", | |
| 157 | + "maxAgents": 10, | |
| 158 | + "budget": { | |
| 159 | + "dailyTokenLimit": 500000, | |
| 160 | + "monthlyBudget": 100 | |
| 161 | + } | |
| 162 | + } | |
| 163 | +} | |
| 164 | +``` | |
| 165 | + | |
| 166 | +--- | |
| 167 | + | |
| 168 | +## 四、生命周期流程 | |
| 169 | + | |
| 170 | +### 4.1 公司创建流程 | |
| 171 | + | |
| 172 | +```mermaid | |
| 173 | +sequenceDiagram | |
| 174 | + participant User as 用户 | |
| 175 | + participant Master as Master Agent | |
| 176 | + participant System as 系统 API | |
| 177 | + participant CEO as 新 CEO Agent | |
| 178 | + | |
| 179 | + User->>Master: "帮我创建一家做公众号运营的公司" | |
| 180 | + Master->>Master: 理解意图 → 确定公司定位和核心 SOP | |
| 181 | + Master->>System: POST /api/company/create | |
| 182 | + Note over System: 1. mkdir data/companies/wechat-media-co/<br>2. 生成 company.json<br>3. 初始化 agents/, goals/, workspace/ | |
| 183 | + System-->>Master: ✅ 公司创建成功 | |
| 184 | + | |
| 185 | + Master->>System: POST /api/company/:id/hire-ceo | |
| 186 | + Note over System: 1. 使用 agent-creator 创建 CEO Agent<br>2. CEO agent.md 写入公司使命<br>3. CEO user.md 写入:上级是 Master | |
| 187 | + System-->>Master: ✅ CEO 已上任 | |
| 188 | + | |
| 189 | + Master->>CEO: TaskDispatch: "你是这家公司的 CEO,请规划战略并组建团队" | |
| 190 | + | |
| 191 | + CEO->>CEO: 分析公司定位 → 设计内容流水线 SOP | |
| 192 | + CEO->>System: POST /api/company/:id/agents/create (批量创建) | |
| 193 | + Note over CEO: 创建: 内容策划、写手、编辑、发布、数据分析 | |
| 194 | + CEO->>System: POST /api/company/:id/goals/create | |
| 195 | + Note over CEO: 创建: 公司 OKR(如:30天粉丝破万) | |
| 196 | + CEO->>System: POST /api/company/:id/pipelines/create | |
| 197 | + Note over CEO: 定义: 每日内容产出 SOP 流水线 | |
| 198 | + | |
| 199 | + CEO-->>Master: "团队组建完毕,流水线已就绪,开始自主运行" | |
| 200 | +``` | |
| 201 | + | |
| 202 | +### 4.2 公司日常运行流程 | |
| 203 | + | |
| 204 | +```mermaid | |
| 205 | +sequenceDiagram | |
| 206 | + participant HB as Heartbeat Service | |
| 207 | + participant CEO as CEO Agent | |
| 208 | + participant Writer as Content Writer | |
| 209 | + participant Editor as Editor | |
| 210 | + participant Pub as Publisher | |
| 211 | + participant DA as Data Analyst | |
| 212 | + | |
| 213 | + loop 每日循环 (自动触发) | |
| 214 | + HB->>CEO: [SYSTEM HEARTBEAT] 早间巡检 | |
| 215 | + CEO->>DA: "分析昨日数据,给出今日选题建议" | |
| 216 | + DA-->>CEO: "昨日阅读量 Top3 关键词: AI教程, 提效工具, 副业" | |
| 217 | + | |
| 218 | + CEO->>Writer: "今日选题: AI提效工具盘点, 要求3000字" | |
| 219 | + Writer-->>Editor: "初稿完成" | |
| 220 | + Editor-->>Writer: "修改意见:开头太平,增加 hook" | |
| 221 | + Writer-->>Editor: "修改稿完成" | |
| 222 | + Editor-->>Pub: "审核通过,可发布" | |
| 223 | + Pub->>Pub: 排版 + 定时发布 | |
| 224 | + Pub-->>CEO: "已发布,预计 18:00 推送" | |
| 225 | + | |
| 226 | + HB->>CEO: [SYSTEM HEARTBEAT] 晚间复盘 | |
| 227 | + CEO->>DA: "拉取今日文章数据" | |
| 228 | + DA-->>CEO: "阅读 2340, 点赞 186, 新增关注 28" | |
| 229 | + CEO->>CEO: 写入 memory → "AI提效选题表现良好,继续跟进" | |
| 230 | + end | |
| 231 | +``` | |
| 232 | + | |
| 233 | +### 4.3 多公司并行 | |
| 234 | + | |
| 235 | +``` | |
| 236 | +用户对 Master 的操作: | |
| 237 | + | |
| 238 | +"帮我查看所有公司的运营状况" | |
| 239 | + → Master 调用: GET /api/company/list | |
| 240 | + → 返回: [ wechat-media-co (运行中, 今日发布1篇), manga-studio (筹建中) ] | |
| 241 | + | |
| 242 | +"漫剧公司的 CEO 表现怎么样?" | |
| 243 | + → Master 调用: GET /api/company/manga-studio/report | |
| 244 | + → 返回: CEO 近7天日报汇总 | |
| 245 | + | |
| 246 | +"关闭自媒体公司" | |
| 247 | + → Master 调用: POST /api/company/wechat-media-co/shutdown | |
| 248 | + → CEO 收到关停指令 → 善后清理 | |
| 249 | +``` | |
| 250 | + | |
| 251 | +--- | |
| 252 | + | |
| 253 | +## 五、API 设计 | |
| 254 | + | |
| 255 | +### 5.1 Company CRUD | |
| 256 | + | |
| 257 | +| 方法 | 路径 | 说明 | | |
| 258 | +|------|------|------| | |
| 259 | +| `POST` | `/api/company/create` | 创建新公司 | | |
| 260 | +| `GET` | `/api/company/list` | 列出所有公司 | | |
| 261 | +| `GET` | `/api/company/:companyId` | 获取公司详情 | | |
| 262 | +| `PUT` | `/api/company/:companyId` | 更新公司信息 | | |
| 263 | +| `POST` | `/api/company/:companyId/shutdown` | 关停公司 | | |
| 264 | + | |
| 265 | +### 5.2 Company 内部:Agent 管理 | |
| 266 | + | |
| 267 | +| 方法 | 路径 | 说明 | | |
| 268 | +|------|------|------| | |
| 269 | +| `POST` | `/api/company/:companyId/agents/create` | 在公司内创建 Agent | | |
| 270 | +| `GET` | `/api/company/:companyId/agents` | 列出公司内所有 Agent | | |
| 271 | +| `POST` | `/api/company/:companyId/hire-ceo` | 为公司任命 CEO | | |
| 272 | + | |
| 273 | +### 5.3 Company 内部:OKR 管理 | |
| 274 | + | |
| 275 | +| 方法 | 路径 | 说明 | | |
| 276 | +|------|------|------| | |
| 277 | +| `POST` | `/api/company/:companyId/goals/create` | 创建公司级 OKR | | |
| 278 | +| `GET` | `/api/company/:companyId/goals` | 获取公司 OKR 列表 | | |
| 279 | + | |
| 280 | +### 5.4 Company 运营 | |
| 281 | + | |
| 282 | +| 方法 | 路径 | 说明 | | |
| 283 | +|------|------|------| | |
| 284 | +| `GET` | `/api/company/:companyId/report` | 获取公司运营报告 | | |
| 285 | +| `POST` | `/api/company/:companyId/heartbeat` | 手动触发公司心跳 | | |
| 286 | + | |
| 287 | +--- | |
| 288 | + | |
| 289 | +## 六、与现有系统的兼容设计 | |
| 290 | + | |
| 291 | +### 6.1 Agent 寻址变化 | |
| 292 | + | |
| 293 | +当前系统的 Agent 通过 `agentId` 全局唯一寻址(如 `ceo`)。 | |
| 294 | +引入 Company 后,Agent 的寻址变为 **Company 限定**: | |
| 295 | + | |
| 296 | +```javascript | |
| 297 | +// 旧: 全局 Agent | |
| 298 | +const agentDir = path.join(DATA_DIR, agentId); | |
| 299 | +// 即: data/agents/ceo/ | |
| 300 | + | |
| 301 | +// 新: 公司内 Agent | |
| 302 | +const agentDir = path.join(COMPANIES_DIR, companyId, 'agents', agentId); | |
| 303 | +// 即: data/companies/wechat-media-co/agents/ceo-wechat/ | |
| 304 | + | |
| 305 | +// 新: 全局 Agent(不属于任何公司) | |
| 306 | +const agentDir = path.join(DATA_DIR, agentId); | |
| 307 | +// 即: data/agents/master/ ← 不变 | |
| 308 | +``` | |
| 309 | + | |
| 310 | +**兼容策略**: | |
| 311 | +- `config.json` 增加 `companyId` 字段(可选)。 | |
| 312 | +- **有 `companyId`** → 在 `data/companies/{companyId}/agents/` 下。 | |
| 313 | +- **无 `companyId`** → 在 `data/agents/` 下(全局)。 | |
| 314 | +- 路由层通过 resolveAgentDir(agentId) 统一封装,向上层透明化。 | |
| 315 | + | |
| 316 | +### 6.2 OKR/Goals 隔离 | |
| 317 | + | |
| 318 | +``` | |
| 319 | +data/goals/ ← 全局大盘(跨公司的顶级战略目标) | |
| 320 | +data/companies/{co}/goals/ ← 公司内部的执行类 OKR | |
| 321 | +``` | |
| 322 | + | |
| 323 | +GoalsService 增加一个 `scope` 参数: | |
| 324 | +- `scope = 'global'` → 读写 `data/goals/` | |
| 325 | +- `scope = companyId` → 读写 `data/companies/{companyId}/goals/` | |
| 326 | + | |
| 327 | +### 6.3 Memory 隔离 | |
| 328 | + | |
| 329 | +Memory 天然隔离:因为 Memory 存储在各个 Agent 的目录下(`agents/{id}/memory/`)。 | |
| 330 | +当公司内的 Agent 在 `data/companies/{co}/agents/{id}/memory/` 下时,自动与全局 Agent 的记忆完全隔离。无代码改动。 | |
| 331 | + | |
| 332 | +### 6.4 Heartbeat 集成 | |
| 333 | + | |
| 334 | +HeartbeatService 扩展扫描范围: | |
| 335 | +- 遍历 `data/agents/` 下有 `heartbeat.enabled` 的全局 Agent。 | |
| 336 | +- 遍历 `data/companies/*/agents/` 下有 `heartbeat.enabled` 的公司内 Agent。 | |
| 337 | +- 可以在 `company.json` 层级设置整个公司的心跳开关。 | |
| 338 | + | |
| 339 | +--- | |
| 340 | + | |
| 341 | +## 七、实现计划 — Todo List | |
| 342 | + | |
| 343 | +### Phase 1: 数据结构基础 | |
| 344 | + | |
| 345 | +- [ ] **1.1** 创建 `data/companies/` 目录和 `company-service.js` | |
| 346 | +- [ ] **1.2** 实现 Company CRUD:create / get / list / update / shutdown | |
| 347 | +- [ ] **1.3** 实现 `resolveAgentDir(agentId, companyId?)` 统一寻址函数 | |
| 348 | +- [ ] **1.4** 修改 `agent-chat.js` 路由支持 `companyId` 上下文 | |
| 349 | + | |
| 350 | +### Phase 2: CEO 自动建制 | |
| 351 | + | |
| 352 | +- [ ] **2.1** 实现 `POST /api/company/:id/hire-ceo`(调用 agent-creator 并自动填充上下文) | |
| 353 | +- [ ] **2.2** CEO 的 `agent.md` 模板:包含公司使命、员工创建权限、SOP 设计权限 | |
| 354 | +- [ ] **2.3** CEO 首次运行后自动规划(通过 TaskDispatch 触发"规划战略并组建团队") | |
| 355 | + | |
| 356 | +### Phase 3: SOP 流水线 | |
| 357 | + | |
| 358 | +- [ ] **3.1** 设计 Pipeline 数据结构(`pipelines/*.json`) | |
| 359 | +- [ ] **3.2** 实现 Pipeline 执行引擎(按步骤自动触发对应 Agent) | |
| 360 | +- [ ] **3.3** CEO 可以通过工具动态调整 Pipeline | |
| 361 | + | |
| 362 | +### Phase 4: 前端 Dashboard | |
| 363 | + | |
| 364 | +- [ ] **4.1** 公司列表页(展示所有公司卡片 + 运行状态) | |
| 365 | +- [ ] **4.2** 公司详情页(组织架构图 + OKR 大盘 + Agent 列表) | |
| 366 | +- [ ] **4.3** 公司日报/周报自动生成与展示 | |
| 367 | + | |
| 368 | +--- | |
| 369 | + | |
| 370 | +## 八、关键技术决策 | |
| 371 | + | |
| 372 | +| # | 问题 | 决策 | 说明 | | |
| 373 | +|---|------|------|------| | |
| 374 | +| 1 | Agent ID 全局唯一还是公司内唯一? | **全局唯一** | 使用 `{role}-{companySlug}` 命名法,如 `ceo-wechat` | | |
| 375 | +| 2 | 原有的 `data/agents/ceo` 怎么处理? | **渐进迁移** | 旧的全局 Agent 保留不动,新建公司时在 companies 下创建 | | |
| 376 | +| 3 | Company 的 CEO 是新建还是复用? | **每家公司新建独立 CEO** | 避免记忆污染和注意力分散 | | |
| 377 | +| 4 | Company 可以嵌套 Company 吗? | **v1.0 不支持** | 先做单层,未来有需求再做集团架构 | | |
| 378 | +| 5 | 跨公司 Agent 共享(如 innovator)| **全局 Agent 池** | `data/agents/` 下的 Agent 可以被任何公司调用 | | |
| 379 | +| 6 | 公司的"关停"语义 | **软关停** | 标记 status=shutdown,停止心跳,保留数据 | | ... | ... |