diff --git a/docs/system-design/24-company-layer-architecture.md b/docs/system-design/24-company-layer-architecture.md new file mode 100644 index 0000000..82aec30 --- /dev/null +++ b/docs/system-design/24-company-layer-architecture.md @@ -0,0 +1,379 @@ +# 24. Company Layer — 公司实例化架构 + +> **版本**: v1.0 (需求分析 & 设计稿) +> **日期**: 2026-03-25 +> **状态**: 规划中 +> **前置**: 四层 Agent 架构 (02 号文档)、OKR 目标体系、Memory 系统、Heartbeat 系统 + +--- + +## 一、核心问题 + +### 当前架构的瓶颈 + +现有的 LemonBoss 采用**扁平化的单公司模型**: + +``` +data/agents/ +├── master ← 用户唯一的交互入口 +├── ceo ← 单一 CEO +├── qa-judge ← 单一 QA +├── poet ← 扁平挂在全局下 +├── innovator ← 扁平挂在全局下 +└── ... +``` + +**问题:** +1. **耦合**:所有 Agent 共存于同一个 `data/agents/` 目录,无法区分"做自媒体的编辑"和"做游戏的编辑"。 +2. **CEO 单例**:只有一个 CEO,如果同时要经营两家公司(自媒体 + 漫剧),CEO 要同时管两条完全不同的业务线,OKR 冲突、记忆污染。 +3. **无法独立闭环**:没有"公司"这个边界,Agent 无法形成一个可以 24 小时自主运转、独立迭代的闭合体。 +4. **无法并行扩展**:用户想创建第二家、第三家公司时,只能不断往同一个池里加人,而非开辟独立的组织空间。 + +### 设计目标 + +用户对 Master 说:**"帮我创建一家做公众号运营的公司"**,系统应该: +1. 创建一个独立的 **Company 实例**(如 `wechat-media-co`) +2. 为该公司分配(或新建)一个 **CEO Agent** +3. CEO 自主规划战略、定义 SOP、创建所需的 Role Agent +4. 公司内部形成**独立闭环**:从内容策划 → 创作 → 审核 → 发布 → 数据回收 → 策略调整 +5. 用户后续再说"帮我创建一家做漫剧的公司",系统创建第二个完全隔离的 Company 实例 + +--- + +## 二、架构演进:从扁平到层级 + +### 2.1 演进前 vs 演进后 + +``` + 【演进前】扁平模型 【演进后】Company 模型 + ───────────────── ────────────────────── + + User (你) User (你) + │ │ + └── Master └── Master (唯一, 全局) + │ │ + ├── CEO ├── Company: 自媒体公司 + ├── qa-judge │ ├── CEO (该公司专属) + ├── poet │ ├── qa-judge + ├── innovator │ ├── content-writer + └── ... │ ├── editor + │ ├── publisher + (所有人在同一个池子) │ └── data-analyst + │ + ├── Company: 漫剧工作室 + │ ├── CEO (另一个专属) + │ ├── scriptwriter + │ ├── artist + │ └── ... + │ + └── 全局 Agent (跨公司复用) + ├── innovator + └── agent-creator +``` + +### 2.2 核心原则 + +| 原则 | 说明 | +|------|------| +| **Master 是老板,不是 CEO** | Master 只管"开公司"和"战略校准",不深入执行 | +| **Company 是隔离边界** | 每家公司有独立的 Agent 池、OKR 树、Memory 空间 | +| **CEO 是公司的内核** | 公司创建后,CEO 是第一个被雇佣的人,由 CEO 自主规划一切 | +| **独立闭环运行** | 一个 Company 从创建到运营,不依赖人类持续干预 | +| **多实例并行** | 多个 Company 并行运转,互不干扰 | + +--- + +## 三、数据结构设计 + +### 3.1 目录结构 + +``` +data/ +├── agents/ ← 全局 Agent(Master + 跨公司工具类 Agent) +│ ├── master/ +│ ├── agent-creator/ +│ └── innovator/ +│ +├── companies/ ← 📦 新增:公司实例目录 +│ ├── wechat-media-co/ ← 公司实例 1 +│ │ ├── company.json ← 公司元数据 +│ │ ├── sop.md ← 公司 SOP(运营标准流程) +│ │ ├── agents/ ← 该公司的专属 Agent 池 +│ │ │ ├── ceo/ +│ │ │ ├── content-writer/ +│ │ │ ├── editor/ +│ │ │ ├── publisher/ +│ │ │ └── data-analyst/ +│ │ ├── goals/ ← 该公司的 OKR 树 +│ │ │ └── G-001/ +│ │ ├── pipelines/ ← 该公司的 SOP 流水线定义 +│ │ │ └── daily-content.json +│ │ └── workspace/ ← 该公司的共享工作区 +│ │ ├── content/ +│ │ └── assets/ +│ │ +│ └── manga-studio/ ← 公司实例 2 +│ ├── company.json +│ ├── agents/ +│ ├── goals/ +│ └── ... +│ +└── goals/ ← 全局 OKR (跨公司的顶层战略目标) +``` + +### 3.2 company.json 结构 + +```json +{ + "id": "wechat-media-co", + "name": "柠檬自媒体", + "description": "专注微信公众号内容运营,以 AI 驱动的内容工厂模式实现日更", + "status": "running", + "createdAt": "2026-03-25T17:00:00Z", + "createdBy": "master", + + "ceo": "ceo-wechat", + + "sop": { + "pipeline": "daily-content", + "description": "选题 → 写稿 → 审核 → 排版 → 发布 → 数据回收" + }, + + "agents": [ + "ceo-wechat", + "content-writer-01", + "editor-01", + "publisher-01", + "data-analyst-01" + ], + + "heartbeat": { + "enabled": true, + "intervalMinutes": 30 + }, + + "config": { + "timezone": "Asia/Shanghai", + "maxAgents": 10, + "budget": { + "dailyTokenLimit": 500000, + "monthlyBudget": 100 + } + } +} +``` + +--- + +## 四、生命周期流程 + +### 4.1 公司创建流程 + +```mermaid +sequenceDiagram + participant User as 用户 + participant Master as Master Agent + participant System as 系统 API + participant CEO as 新 CEO Agent + + User->>Master: "帮我创建一家做公众号运营的公司" + Master->>Master: 理解意图 → 确定公司定位和核心 SOP + Master->>System: POST /api/company/create + Note over System: 1. mkdir data/companies/wechat-media-co/
2. 生成 company.json
3. 初始化 agents/, goals/, workspace/ + System-->>Master: ✅ 公司创建成功 + + Master->>System: POST /api/company/:id/hire-ceo + Note over System: 1. 使用 agent-creator 创建 CEO Agent
2. CEO agent.md 写入公司使命
3. CEO user.md 写入:上级是 Master + System-->>Master: ✅ CEO 已上任 + + Master->>CEO: TaskDispatch: "你是这家公司的 CEO,请规划战略并组建团队" + + CEO->>CEO: 分析公司定位 → 设计内容流水线 SOP + CEO->>System: POST /api/company/:id/agents/create (批量创建) + Note over CEO: 创建: 内容策划、写手、编辑、发布、数据分析 + CEO->>System: POST /api/company/:id/goals/create + Note over CEO: 创建: 公司 OKR(如:30天粉丝破万) + CEO->>System: POST /api/company/:id/pipelines/create + Note over CEO: 定义: 每日内容产出 SOP 流水线 + + CEO-->>Master: "团队组建完毕,流水线已就绪,开始自主运行" +``` + +### 4.2 公司日常运行流程 + +```mermaid +sequenceDiagram + participant HB as Heartbeat Service + participant CEO as CEO Agent + participant Writer as Content Writer + participant Editor as Editor + participant Pub as Publisher + participant DA as Data Analyst + + loop 每日循环 (自动触发) + HB->>CEO: [SYSTEM HEARTBEAT] 早间巡检 + CEO->>DA: "分析昨日数据,给出今日选题建议" + DA-->>CEO: "昨日阅读量 Top3 关键词: AI教程, 提效工具, 副业" + + CEO->>Writer: "今日选题: AI提效工具盘点, 要求3000字" + Writer-->>Editor: "初稿完成" + Editor-->>Writer: "修改意见:开头太平,增加 hook" + Writer-->>Editor: "修改稿完成" + Editor-->>Pub: "审核通过,可发布" + Pub->>Pub: 排版 + 定时发布 + Pub-->>CEO: "已发布,预计 18:00 推送" + + HB->>CEO: [SYSTEM HEARTBEAT] 晚间复盘 + CEO->>DA: "拉取今日文章数据" + DA-->>CEO: "阅读 2340, 点赞 186, 新增关注 28" + CEO->>CEO: 写入 memory → "AI提效选题表现良好,继续跟进" + end +``` + +### 4.3 多公司并行 + +``` +用户对 Master 的操作: + +"帮我查看所有公司的运营状况" + → Master 调用: GET /api/company/list + → 返回: [ wechat-media-co (运行中, 今日发布1篇), manga-studio (筹建中) ] + +"漫剧公司的 CEO 表现怎么样?" + → Master 调用: GET /api/company/manga-studio/report + → 返回: CEO 近7天日报汇总 + +"关闭自媒体公司" + → Master 调用: POST /api/company/wechat-media-co/shutdown + → CEO 收到关停指令 → 善后清理 +``` + +--- + +## 五、API 设计 + +### 5.1 Company CRUD + +| 方法 | 路径 | 说明 | +|------|------|------| +| `POST` | `/api/company/create` | 创建新公司 | +| `GET` | `/api/company/list` | 列出所有公司 | +| `GET` | `/api/company/:companyId` | 获取公司详情 | +| `PUT` | `/api/company/:companyId` | 更新公司信息 | +| `POST` | `/api/company/:companyId/shutdown` | 关停公司 | + +### 5.2 Company 内部:Agent 管理 + +| 方法 | 路径 | 说明 | +|------|------|------| +| `POST` | `/api/company/:companyId/agents/create` | 在公司内创建 Agent | +| `GET` | `/api/company/:companyId/agents` | 列出公司内所有 Agent | +| `POST` | `/api/company/:companyId/hire-ceo` | 为公司任命 CEO | + +### 5.3 Company 内部:OKR 管理 + +| 方法 | 路径 | 说明 | +|------|------|------| +| `POST` | `/api/company/:companyId/goals/create` | 创建公司级 OKR | +| `GET` | `/api/company/:companyId/goals` | 获取公司 OKR 列表 | + +### 5.4 Company 运营 + +| 方法 | 路径 | 说明 | +|------|------|------| +| `GET` | `/api/company/:companyId/report` | 获取公司运营报告 | +| `POST` | `/api/company/:companyId/heartbeat` | 手动触发公司心跳 | + +--- + +## 六、与现有系统的兼容设计 + +### 6.1 Agent 寻址变化 + +当前系统的 Agent 通过 `agentId` 全局唯一寻址(如 `ceo`)。 +引入 Company 后,Agent 的寻址变为 **Company 限定**: + +```javascript +// 旧: 全局 Agent +const agentDir = path.join(DATA_DIR, agentId); +// 即: data/agents/ceo/ + +// 新: 公司内 Agent +const agentDir = path.join(COMPANIES_DIR, companyId, 'agents', agentId); +// 即: data/companies/wechat-media-co/agents/ceo-wechat/ + +// 新: 全局 Agent(不属于任何公司) +const agentDir = path.join(DATA_DIR, agentId); +// 即: data/agents/master/ ← 不变 +``` + +**兼容策略**: +- `config.json` 增加 `companyId` 字段(可选)。 +- **有 `companyId`** → 在 `data/companies/{companyId}/agents/` 下。 +- **无 `companyId`** → 在 `data/agents/` 下(全局)。 +- 路由层通过 resolveAgentDir(agentId) 统一封装,向上层透明化。 + +### 6.2 OKR/Goals 隔离 + +``` +data/goals/ ← 全局大盘(跨公司的顶级战略目标) +data/companies/{co}/goals/ ← 公司内部的执行类 OKR +``` + +GoalsService 增加一个 `scope` 参数: +- `scope = 'global'` → 读写 `data/goals/` +- `scope = companyId` → 读写 `data/companies/{companyId}/goals/` + +### 6.3 Memory 隔离 + +Memory 天然隔离:因为 Memory 存储在各个 Agent 的目录下(`agents/{id}/memory/`)。 +当公司内的 Agent 在 `data/companies/{co}/agents/{id}/memory/` 下时,自动与全局 Agent 的记忆完全隔离。无代码改动。 + +### 6.4 Heartbeat 集成 + +HeartbeatService 扩展扫描范围: +- 遍历 `data/agents/` 下有 `heartbeat.enabled` 的全局 Agent。 +- 遍历 `data/companies/*/agents/` 下有 `heartbeat.enabled` 的公司内 Agent。 +- 可以在 `company.json` 层级设置整个公司的心跳开关。 + +--- + +## 七、实现计划 — Todo List + +### Phase 1: 数据结构基础 + +- [ ] **1.1** 创建 `data/companies/` 目录和 `company-service.js` +- [ ] **1.2** 实现 Company CRUD:create / get / list / update / shutdown +- [ ] **1.3** 实现 `resolveAgentDir(agentId, companyId?)` 统一寻址函数 +- [ ] **1.4** 修改 `agent-chat.js` 路由支持 `companyId` 上下文 + +### Phase 2: CEO 自动建制 + +- [ ] **2.1** 实现 `POST /api/company/:id/hire-ceo`(调用 agent-creator 并自动填充上下文) +- [ ] **2.2** CEO 的 `agent.md` 模板:包含公司使命、员工创建权限、SOP 设计权限 +- [ ] **2.3** CEO 首次运行后自动规划(通过 TaskDispatch 触发"规划战略并组建团队") + +### Phase 3: SOP 流水线 + +- [ ] **3.1** 设计 Pipeline 数据结构(`pipelines/*.json`) +- [ ] **3.2** 实现 Pipeline 执行引擎(按步骤自动触发对应 Agent) +- [ ] **3.3** CEO 可以通过工具动态调整 Pipeline + +### Phase 4: 前端 Dashboard + +- [ ] **4.1** 公司列表页(展示所有公司卡片 + 运行状态) +- [ ] **4.2** 公司详情页(组织架构图 + OKR 大盘 + Agent 列表) +- [ ] **4.3** 公司日报/周报自动生成与展示 + +--- + +## 八、关键技术决策 + +| # | 问题 | 决策 | 说明 | +|---|------|------|------| +| 1 | Agent ID 全局唯一还是公司内唯一? | **全局唯一** | 使用 `{role}-{companySlug}` 命名法,如 `ceo-wechat` | +| 2 | 原有的 `data/agents/ceo` 怎么处理? | **渐进迁移** | 旧的全局 Agent 保留不动,新建公司时在 companies 下创建 | +| 3 | Company 的 CEO 是新建还是复用? | **每家公司新建独立 CEO** | 避免记忆污染和注意力分散 | +| 4 | Company 可以嵌套 Company 吗? | **v1.0 不支持** | 先做单层,未来有需求再做集团架构 | +| 5 | 跨公司 Agent 共享(如 innovator)| **全局 Agent 池** | `data/agents/` 下的 Agent 可以被任何公司调用 | +| 6 | 公司的"关停"语义 | **软关停** | 标记 status=shutdown,停止心跳,保留数据 |