Commit 49e795a7efcdf59fa7448031fc867a2cceb7205f
1 parent
f1ece951
docs: add Agent Hiring Pipeline, template system, Company-scoped OKR to design doc 24
Showing
1 changed file
with
291 additions
and
107 deletions
docs/system-design/24-company-layer-architecture.md
| @@ -89,36 +89,33 @@ data/agents/ | @@ -89,36 +89,33 @@ data/agents/ | ||
| 89 | 89 | ||
| 90 | ``` | 90 | ``` |
| 91 | data/ | 91 | data/ |
| 92 | -├── agents/ ← 全局 Agent(Master + 跨公司工具类 Agent) | 92 | +├── agents/ ← 全局 Agent(Master + 跨公司基础设施 Agent) |
| 93 | │ ├── master/ | 93 | │ ├── master/ |
| 94 | │ ├── agent-creator/ | 94 | │ ├── agent-creator/ |
| 95 | │ └── innovator/ | 95 | │ └── innovator/ |
| 96 | │ | 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 | -│ └── ... | 97 | +├── templates/ ← 📦 Agent 模板库(招聘时优先查找) |
| 98 | +│ ├── ceo/ ← CEO 通用模板 | ||
| 99 | +│ ├── qa-judge/ ← 质量仲裁模板 | ||
| 100 | +│ ├── content-writer/ ← 内容写手模板 | ||
| 101 | +│ ├── editor/ ← 编辑模板 | ||
| 102 | +│ ├── video-editor/ ← 剪辑师模板 | ||
| 103 | +│ ├── hot-topic-hunter/ ← 热点搜索模板 | ||
| 104 | +│ └── data-analyst/ ← 数据分析师模板 | ||
| 120 | │ | 105 | │ |
| 121 | -└── goals/ ← 全局 OKR (跨公司的顶层战略目标) | 106 | +├── {company-id}/ ← 公司实例(顶层目录,扁平化) |
| 107 | +│ ├── company.json ← 公司元数据 + 状态 + 配置 | ||
| 108 | +│ ├── sop.md ← 公司 SOP(运营标准流程) | ||
| 109 | +│ ├── agents/ ← 该公司的专属 Agent 池 | ||
| 110 | +│ │ ├── ceo/ | ||
| 111 | +│ │ ├── content-writer/ | ||
| 112 | +│ │ ├── editor/ | ||
| 113 | +│ │ └── data-analyst/ | ||
| 114 | +│ ├── goals/ ← 该公司的 OKR 树(所有目标都在公司层级下) | ||
| 115 | +│ ├── pipelines/ ← 该公司的 SOP 流水线定义 | ||
| 116 | +│ └── workspace/ ← 该公司的共享工作区(成品、品牌资产) | ||
| 117 | +│ | ||
| 118 | +└── skills/ ← 全局 Skill(可被任何公司的 Agent 调用) | ||
| 122 | ``` | 119 | ``` |
| 123 | 120 | ||
| 124 | ### 3.2 company.json 结构 | 121 | ### 3.2 company.json 结构 |
| @@ -132,20 +129,14 @@ data/ | @@ -132,20 +129,14 @@ data/ | ||
| 132 | "createdAt": "2026-03-25T17:00:00Z", | 129 | "createdAt": "2026-03-25T17:00:00Z", |
| 133 | "createdBy": "master", | 130 | "createdBy": "master", |
| 134 | 131 | ||
| 135 | - "ceo": "ceo-wechat", | 132 | + "ceo": "ceo", |
| 136 | 133 | ||
| 137 | "sop": { | 134 | "sop": { |
| 138 | "pipeline": "daily-content", | 135 | "pipeline": "daily-content", |
| 139 | "description": "选题 → 写稿 → 审核 → 排版 → 发布 → 数据回收" | 136 | "description": "选题 → 写稿 → 审核 → 排版 → 发布 → 数据回收" |
| 140 | }, | 137 | }, |
| 141 | 138 | ||
| 142 | - "agents": [ | ||
| 143 | - "ceo-wechat", | ||
| 144 | - "content-writer-01", | ||
| 145 | - "editor-01", | ||
| 146 | - "publisher-01", | ||
| 147 | - "data-analyst-01" | ||
| 148 | - ], | 139 | + "agents": ["ceo", "content-writer", "editor", "publisher", "data-analyst"], |
| 149 | 140 | ||
| 150 | "heartbeat": { | 141 | "heartbeat": { |
| 151 | "enabled": true, | 142 | "enabled": true, |
| @@ -165,37 +156,213 @@ data/ | @@ -165,37 +156,213 @@ data/ | ||
| 165 | 156 | ||
| 166 | --- | 157 | --- |
| 167 | 158 | ||
| 168 | -## 四、生命周期流程 | 159 | +## 四、Agent 招聘系统 (Hiring Pipeline) |
| 160 | + | ||
| 161 | +> **核心理念**: 公司需要某个角色时,不是凭空创造,而是走一套完整的**招聘流程**—— | ||
| 162 | +> 先从人才市场(模板库)找现成的,找不到就培养一个新人,培训合格后才能上岗。 | ||
| 169 | 163 | ||
| 170 | -### 4.1 公司创建流程 | 164 | +### 4.1 招聘流程总览 |
| 165 | + | ||
| 166 | +```mermaid | ||
| 167 | +flowchart TD | ||
| 168 | + A["CEO 需要一个角色<br>(如: 热点搜索员)"] --> B{"在 templates/ 中<br>查找匹配模板?"} | ||
| 169 | + | ||
| 170 | + B -->|"✅ 找到模板"| C["复制模板到<br>公司 agents/ 目录"] | ||
| 171 | + C --> D["注入公司上下文<br>(改写 agent.md, soul.md, user.md)"] | ||
| 172 | + D --> E["直接上岗 ✅"] | ||
| 173 | + | ||
| 174 | + B -->|"❌ 模板库无此角色"| F["调用 agent-creator<br>从零创建 Agent 骨架"] | ||
| 175 | + F --> G["调用 innovator<br>进入 FDE 训练流水线"] | ||
| 176 | + G --> H{"Benchmark<br>评分 ≥ 95?"} | ||
| 177 | + | ||
| 178 | + H -->|"❌ 不合格"| I["继续 Evolve 迭代<br>(自动重训)"] | ||
| 179 | + I --> H | ||
| 180 | + | ||
| 181 | + H -->|"✅ 合格"| J["毕业 → 存入 templates/<br>(供未来复用)"] | ||
| 182 | + J --> C | ||
| 183 | +``` | ||
| 184 | + | ||
| 185 | +### 4.2 招聘三阶段详解 | ||
| 186 | + | ||
| 187 | +#### 阶段 A: 模板库查找 (Template Lookup) | ||
| 188 | + | ||
| 189 | +```javascript | ||
| 190 | +// 伪代码: hire(roleName, companyId) | ||
| 191 | +function hire(roleName, companyId) { | ||
| 192 | + const templateDir = path.join(DATA_DIR, 'templates', roleName); | ||
| 193 | + | ||
| 194 | + if (fs.existsSync(templateDir)) { | ||
| 195 | + // ✅ 模板存在 → 直接复制 + 定制 | ||
| 196 | + copyDir(templateDir, `data/${companyId}/agents/${roleName}/`); | ||
| 197 | + injectCompanyContext(companyId, roleName); | ||
| 198 | + return { status: 'hired_from_template', ready: true }; | ||
| 199 | + } else { | ||
| 200 | + // ❌ 模板不存在 → 进入培养流程 | ||
| 201 | + return trainNewAgent(roleName, companyId); | ||
| 202 | + } | ||
| 203 | +} | ||
| 204 | +``` | ||
| 205 | + | ||
| 206 | +**模板库是不断扩充的人才市场**: | ||
| 207 | +- 初始模板:`ceo`, `qa-judge`, `content-writer`, `editor` 等通用角色 | ||
| 208 | +- 每次从零培养的新角色,训练合格后**自动沉淀回 `templates/`**,下次招聘同类角色时就能直接使用 | ||
| 209 | +- 模板只保存骨架(agent.md, soul.md, skills/, config.json),不带记忆和工作区 | ||
| 210 | + | ||
| 211 | +#### 阶段 B: 从零培养 (Create + Train) | ||
| 212 | + | ||
| 213 | +当模板库中没有对应角色时,进入培养流水线: | ||
| 214 | + | ||
| 215 | +``` | ||
| 216 | +Step 1: agent-creator 创建骨架 | ||
| 217 | + → 生成 agent.md, soul.md, identity.md, config.json | ||
| 218 | + → 定义角色的核心职责和工具清单 | ||
| 219 | + → 此时 Agent 状态为 "training"(不可执行正式任务) | ||
| 220 | + | ||
| 221 | +Step 2: innovator 执行 FDE 训练 | ||
| 222 | + → F (Find): 调研该角色领域的最佳实践和行业知识 | ||
| 223 | + → D (Digest): 消化知识转化为 Agent 的技能定义 (SKILL.md) | ||
| 224 | + → E (Evolve): 循环迭代优化,直到技能评分达标 | ||
| 225 | + | ||
| 226 | +Step 3: Benchmark 评估 | ||
| 227 | + → 运行标准化的能力测试用例 | ||
| 228 | + → 评分维度:任务完成度、输出质量、工具使用准确性、响应时间 | ||
| 229 | + → 合格线:综合评分 ≥ 95 分 | ||
| 230 | +``` | ||
| 231 | + | ||
| 232 | +#### 阶段 C: 合格上岗 + 模板沉淀 | ||
| 233 | + | ||
| 234 | +``` | ||
| 235 | +训练合格后: | ||
| 236 | + 1. Agent 状态从 "training" → "ready" | ||
| 237 | + 2. 复制干净骨架到 templates/ (不含训练过程中的 memory 和 workspace) | ||
| 238 | + 3. 注入公司上下文到公司实例 | ||
| 239 | + 4. 正式加入公司 agents/ 池 | ||
| 240 | + 5. 更新 company.json 的 agents 列表 | ||
| 241 | + 6. CEO 收到通知:"新员工 {roleName} 已入职" | ||
| 242 | +``` | ||
| 243 | + | ||
| 244 | +### 4.3 Agent 状态机 | ||
| 245 | + | ||
| 246 | +``` | ||
| 247 | + ┌── training ──► ready ──► active | ||
| 248 | + │ │ | ||
| 249 | + (从零培养) │ │ (公司暂停/开除) | ||
| 250 | + │ ▼ | ||
| 251 | + │ suspended | ||
| 252 | + │ | ||
| 253 | + (模板复制) └── ready ─────────────► active | ||
| 254 | +``` | ||
| 255 | + | ||
| 256 | +| 状态 | 含义 | 能否接任务 | | ||
| 257 | +|------|------|-----------| | ||
| 258 | +| `training` | 正在被 Innovator 训练中,Benchmark 尚未达标 | ❌ 不能 | | ||
| 259 | +| `ready` | 训练完毕或模板复制完毕,等待上岗 | ❌ 等待分配 | | ||
| 260 | +| `active` | 已加入公司,处于正式工作状态 | ✅ 能 | | ||
| 261 | +| `suspended` | 被 CEO 暂停(表现不佳或公司调整) | ❌ 暂停 | | ||
| 262 | + | ||
| 263 | +### 4.4 模板库管理 | ||
| 264 | + | ||
| 265 | +模板库 `data/templates/` 是一个**不断进化的人才市场**: | ||
| 266 | + | ||
| 267 | +``` | ||
| 268 | +data/templates/ | ||
| 269 | +├── ceo/ ← 通用 CEO 模板 | ||
| 270 | +│ ├── agent.md ← 通用的 CEO 职责(不含特定公司信息) | ||
| 271 | +│ ├── soul.md ← CEO 通用思维模式 | ||
| 272 | +│ ├── identity.md | ||
| 273 | +│ ├── config.json ← type: "cxo" | ||
| 274 | +│ └── skills/ ← CEO 通用技能 | ||
| 275 | +│ | ||
| 276 | +├── content-writer/ ← 内容写手模板 | ||
| 277 | +├── video-editor/ ← 剪辑师模板 | ||
| 278 | +├── hot-topic-hunter/ ← 热点搜索员模板 | ||
| 279 | +├── data-analyst/ ← 数据分析师模板 | ||
| 280 | +├── qa-judge/ ← 质量仲裁模板 | ||
| 281 | +│ | ||
| 282 | +└── _registry.json ← 模板注册表(索引所有可用模板) | ||
| 283 | +``` | ||
| 284 | + | ||
| 285 | +**`_registry.json` 结构**: | ||
| 286 | +```json | ||
| 287 | +[ | ||
| 288 | + { | ||
| 289 | + "id": "ceo", | ||
| 290 | + "name": "CEO / 首席执行官", | ||
| 291 | + "type": "cxo", | ||
| 292 | + "description": "公司战略规划、团队管理、OKR 制定", | ||
| 293 | + "benchmarkScore": 97, | ||
| 294 | + "trainedAt": "2026-03-20", | ||
| 295 | + "usedCount": 3 | ||
| 296 | + }, | ||
| 297 | + { | ||
| 298 | + "id": "hot-topic-hunter", | ||
| 299 | + "name": "热点搜索员", | ||
| 300 | + "type": "specialist", | ||
| 301 | + "description": "全网热点监控、选题建议、趋势分析", | ||
| 302 | + "benchmarkScore": 96, | ||
| 303 | + "trainedAt": "2026-03-25", | ||
| 304 | + "usedCount": 0 | ||
| 305 | + } | ||
| 306 | +] | ||
| 307 | +``` | ||
| 308 | + | ||
| 309 | +### 4.5 复制时的上下文注入 | ||
| 310 | + | ||
| 311 | +从模板复制到公司后,必须改写以下文件: | ||
| 312 | + | ||
| 313 | +| 文件 | 注入内容 | | ||
| 314 | +|------|---------| | ||
| 315 | +| `agent.md` | 追加:所属公司名称、公司使命、公司特定的约束规则 | | ||
| 316 | +| `soul.md` | 追加:公司文化和价值观(如"我们是一家注重数据驱动的自媒体") | | ||
| 317 | +| `user.md` | 重写:上级是该公司的 CEO(而非 Master),写入 CEO 的偏好 | | ||
| 318 | +| `config.json` | 添加 `companyId` 字段,更新 `parent_id` | | ||
| 319 | +| `memory/memory.md` | 初始化为空白(新公司、新记忆,不继承模板记忆) | | ||
| 320 | + | ||
| 321 | +--- | ||
| 322 | + | ||
| 323 | +## 五、生命周期流程 | ||
| 324 | + | ||
| 325 | +### 5.1 公司创建 + 招聘全流程 | ||
| 171 | 326 | ||
| 172 | ```mermaid | 327 | ```mermaid |
| 173 | sequenceDiagram | 328 | sequenceDiagram |
| 174 | participant User as 用户 | 329 | participant User as 用户 |
| 175 | participant Master as Master Agent | 330 | participant Master as Master Agent |
| 176 | participant System as 系统 API | 331 | participant System as 系统 API |
| 332 | + participant AC as agent-creator | ||
| 333 | + participant Inno as innovator | ||
| 177 | participant CEO as 新 CEO Agent | 334 | participant CEO as 新 CEO Agent |
| 178 | 335 | ||
| 179 | User->>Master: "帮我创建一家做公众号运营的公司" | 336 | User->>Master: "帮我创建一家做公众号运营的公司" |
| 180 | Master->>Master: 理解意图 → 确定公司定位和核心 SOP | 337 | Master->>Master: 理解意图 → 确定公司定位和核心 SOP |
| 181 | Master->>System: POST /api/company/create | 338 | 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/ | 339 | + Note over System: 1. mkdir data/wechat-media-co/<br>2. 生成 company.json<br>3. 初始化 agents/, goals/, workspace/ |
| 183 | System-->>Master: ✅ 公司创建成功 | 340 | 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 | - | 341 | + |
| 342 | + Master->>System: POST /api/company/:id/hire { role: "ceo" } | ||
| 343 | + Note over System: 在 templates/ 查找 "ceo" → ✅ 找到 | ||
| 344 | + System->>System: 复制 templates/ceo → wechat-media-co/agents/ceo/ | ||
| 345 | + System->>System: 注入公司上下文 (agent.md, user.md) | ||
| 346 | + System-->>Master: ✅ CEO 已入职 | ||
| 347 | + | ||
| 189 | Master->>CEO: TaskDispatch: "你是这家公司的 CEO,请规划战略并组建团队" | 348 | Master->>CEO: TaskDispatch: "你是这家公司的 CEO,请规划战略并组建团队" |
| 190 | - | ||
| 191 | - CEO->>CEO: 分析公司定位 → 设计内容流水线 SOP | ||
| 192 | - CEO->>System: POST /api/company/:id/agents/create (批量创建) | ||
| 193 | - Note over CEO: 创建: 内容策划、写手、编辑、发布、数据分析 | 349 | + |
| 350 | + CEO->>CEO: 分析公司定位 → 确定需要哪些角色 | ||
| 351 | + CEO->>System: POST /api/company/:id/hire { role: "content-writer" } | ||
| 352 | + Note over System: templates/ 查找 → ✅ 找到 → 复制 + 注入 | ||
| 353 | + CEO->>System: POST /api/company/:id/hire { role: "hot-topic-hunter" } | ||
| 354 | + Note over System: templates/ 查找 → ❌ 没有 | ||
| 355 | + System->>AC: 创建 "hot-topic-hunter" Agent 骨架 | ||
| 356 | + AC-->>System: 骨架已就绪 | ||
| 357 | + System->>Inno: 启动 FDE 训练 (hot-topic-hunter) | ||
| 358 | + Inno->>Inno: Find → Digest → Evolve (循环至 ≥95) | ||
| 359 | + Inno-->>System: ✅ Benchmark 97 分,训练合格 | ||
| 360 | + System->>System: 沉淀到 templates/hot-topic-hunter/ | ||
| 361 | + System->>System: 复制到 wechat-media-co/agents/ + 注入上下文 | ||
| 362 | + System-->>CEO: ✅ 热点搜索员已入职 | ||
| 363 | + | ||
| 194 | CEO->>System: POST /api/company/:id/goals/create | 364 | CEO->>System: POST /api/company/:id/goals/create |
| 195 | - Note over CEO: 创建: 公司 OKR(如:30天粉丝破万) | ||
| 196 | CEO->>System: POST /api/company/:id/pipelines/create | 365 | CEO->>System: POST /api/company/:id/pipelines/create |
| 197 | - Note over CEO: 定义: 每日内容产出 SOP 流水线 | ||
| 198 | - | ||
| 199 | CEO-->>Master: "团队组建完毕,流水线已就绪,开始自主运行" | 366 | CEO-->>Master: "团队组建完毕,流水线已就绪,开始自主运行" |
| 200 | ``` | 367 | ``` |
| 201 | 368 | ||
| @@ -250,9 +417,9 @@ sequenceDiagram | @@ -250,9 +417,9 @@ sequenceDiagram | ||
| 250 | 417 | ||
| 251 | --- | 418 | --- |
| 252 | 419 | ||
| 253 | -## 五、API 设计 | 420 | +## 六、API 设计 |
| 254 | 421 | ||
| 255 | -### 5.1 Company CRUD | 422 | +### 6.1 Company CRUD |
| 256 | 423 | ||
| 257 | | 方法 | 路径 | 说明 | | 424 | | 方法 | 路径 | 说明 | |
| 258 | |------|------|------| | 425 | |------|------|------| |
| @@ -262,22 +429,31 @@ sequenceDiagram | @@ -262,22 +429,31 @@ sequenceDiagram | ||
| 262 | | `PUT` | `/api/company/:companyId` | 更新公司信息 | | 429 | | `PUT` | `/api/company/:companyId` | 更新公司信息 | |
| 263 | | `POST` | `/api/company/:companyId/shutdown` | 关停公司 | | 430 | | `POST` | `/api/company/:companyId/shutdown` | 关停公司 | |
| 264 | 431 | ||
| 265 | -### 5.2 Company 内部:Agent 管理 | 432 | +### 6.2 招聘与 Agent 管理 |
| 266 | 433 | ||
| 267 | | 方法 | 路径 | 说明 | | 434 | | 方法 | 路径 | 说明 | |
| 268 | |------|------|------| | 435 | |------|------|------| |
| 269 | -| `POST` | `/api/company/:companyId/agents/create` | 在公司内创建 Agent | | 436 | +| `POST` | `/api/company/:companyId/hire` | 招聘 Agent (模板优先 → 培养兜底) | |
| 270 | | `GET` | `/api/company/:companyId/agents` | 列出公司内所有 Agent | | 437 | | `GET` | `/api/company/:companyId/agents` | 列出公司内所有 Agent | |
| 271 | -| `POST` | `/api/company/:companyId/hire-ceo` | 为公司任命 CEO | | 438 | +| `POST` | `/api/company/:companyId/agent/:agentId/chat` | 与公司内 Agent 对话 | |
| 439 | +| `POST` | `/api/company/:companyId/fire` | 解雇 Agent (suspend) | | ||
| 272 | 440 | ||
| 273 | -### 5.3 Company 内部:OKR 管理 | 441 | +### 6.3 模板库 |
| 274 | 442 | ||
| 275 | | 方法 | 路径 | 说明 | | 443 | | 方法 | 路径 | 说明 | |
| 276 | |------|------|------| | 444 | |------|------|------| |
| 277 | -| `POST` | `/api/company/:companyId/goals/create` | 创建公司级 OKR | | 445 | +| `GET` | `/api/templates` | 列出所有可用模板 | |
| 446 | +| `GET` | `/api/templates/:templateId` | 查看模板详情 | | ||
| 447 | + | ||
| 448 | +### 6.4 Company 内部:OKR 管理 | ||
| 449 | + | ||
| 450 | +| 方法 | 路径 | 说明 | | ||
| 451 | +|------|------|------| | ||
| 452 | +| `POST` | `/api/company/:companyId/goals/create` | 创建公司 OKR | | ||
| 278 | | `GET` | `/api/company/:companyId/goals` | 获取公司 OKR 列表 | | 453 | | `GET` | `/api/company/:companyId/goals` | 获取公司 OKR 列表 | |
| 454 | +| `PUT` | `/api/company/:companyId/goals/:goalId` | 更新 OKR 节点 | | ||
| 279 | 455 | ||
| 280 | -### 5.4 Company 运营 | 456 | +### 6.5 Company 运营 |
| 281 | 457 | ||
| 282 | | 方法 | 路径 | 说明 | | 458 | | 方法 | 路径 | 说明 | |
| 283 | |------|------|------| | 459 | |------|------|------| |
| @@ -286,94 +462,102 @@ sequenceDiagram | @@ -286,94 +462,102 @@ sequenceDiagram | ||
| 286 | 462 | ||
| 287 | --- | 463 | --- |
| 288 | 464 | ||
| 289 | -## 六、与现有系统的兼容设计 | 465 | +## 七、与现有系统的兼容设计 |
| 290 | 466 | ||
| 291 | -### 6.1 Agent 寻址变化 | 467 | +### 7.1 Agent 寻址变化 |
| 292 | 468 | ||
| 293 | 当前系统的 Agent 通过 `agentId` 全局唯一寻址(如 `ceo`)。 | 469 | 当前系统的 Agent 通过 `agentId` 全局唯一寻址(如 `ceo`)。 |
| 294 | 引入 Company 后,Agent 的寻址变为 **Company 限定**: | 470 | 引入 Company 后,Agent 的寻址变为 **Company 限定**: |
| 295 | 471 | ||
| 296 | ```javascript | 472 | ```javascript |
| 297 | -// 旧: 全局 Agent | ||
| 298 | -const agentDir = path.join(DATA_DIR, agentId); | ||
| 299 | -// 即: data/agents/ceo/ | 473 | +// 全局 Agent(不属于任何公司) |
| 474 | +const agentDir = path.join(DATA_DIR, 'agents', agentId); | ||
| 475 | +// 即: data/agents/master/ | ||
| 300 | 476 | ||
| 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/ ← 不变 | 477 | +// 公司内 Agent |
| 478 | +const agentDir = path.join(DATA_DIR, companyId, 'agents', agentId); | ||
| 479 | +// 即: data/wechat-media-co/agents/ceo/ | ||
| 308 | ``` | 480 | ``` |
| 309 | 481 | ||
| 310 | **兼容策略**: | 482 | **兼容策略**: |
| 311 | - `config.json` 增加 `companyId` 字段(可选)。 | 483 | - `config.json` 增加 `companyId` 字段(可选)。 |
| 312 | -- **有 `companyId`** → 在 `data/companies/{companyId}/agents/` 下。 | 484 | +- **有 `companyId`** → 在 `data/{companyId}/agents/` 下。 |
| 313 | - **无 `companyId`** → 在 `data/agents/` 下(全局)。 | 485 | - **无 `companyId`** → 在 `data/agents/` 下(全局)。 |
| 314 | -- 路由层通过 resolveAgentDir(agentId) 统一封装,向上层透明化。 | 486 | +- 路由层通过 `resolveAgentDir(companyId, agentId)` 统一封装,向上层透明化。 |
| 487 | + | ||
| 488 | +### 7.2 OKR/Goals — 全部归属 Company | ||
| 315 | 489 | ||
| 316 | -### 6.2 OKR/Goals 隔离 | 490 | +Goals/OKR 不再有全局作用域。**每个 Goal 都必须隶属于一个 Company**: |
| 317 | 491 | ||
| 318 | ``` | 492 | ``` |
| 319 | -data/goals/ ← 全局大盘(跨公司的顶级战略目标) | ||
| 320 | -data/companies/{co}/goals/ ← 公司内部的执行类 OKR | 493 | +data/wechat-media-co/goals/G-001/ ← 自媒体公司的 OKR |
| 494 | +data/manga-studio/goals/G-001/ ← 漫剧公司的 OKR(ID 互不冲突) | ||
| 321 | ``` | 495 | ``` |
| 322 | 496 | ||
| 323 | -GoalsService 增加一个 `scope` 参数: | ||
| 324 | -- `scope = 'global'` → 读写 `data/goals/` | ||
| 325 | -- `scope = companyId` → 读写 `data/companies/{companyId}/goals/` | 497 | +GoalsService 改造: |
| 498 | +- 构造时必须传入 `companyId`:`new GoalsService(companyId)` | ||
| 499 | +- 数据路径变为 `data/{companyId}/goals/` | ||
| 500 | +- `_index.json` 也随之放在公司目录下 | ||
| 326 | 501 | ||
| 327 | -### 6.3 Memory 隔离 | 502 | +### 7.3 Memory 隔离 |
| 328 | 503 | ||
| 329 | -Memory 天然隔离:因为 Memory 存储在各个 Agent 的目录下(`agents/{id}/memory/`)。 | ||
| 330 | -当公司内的 Agent 在 `data/companies/{co}/agents/{id}/memory/` 下时,自动与全局 Agent 的记忆完全隔离。无代码改动。 | 504 | +Memory 天然隔离:因为 Memory 存储在各个 Agent 的目录下。 |
| 505 | +公司内的 Agent 在 `data/{companyId}/agents/{agentId}/memory/` 下,自动与其他公司和全局 Agent 的记忆完全隔离。无额外代码改动。 | ||
| 331 | 506 | ||
| 332 | -### 6.4 Heartbeat 集成 | 507 | +### 7.4 Heartbeat 集成 |
| 333 | 508 | ||
| 334 | HeartbeatService 扩展扫描范围: | 509 | HeartbeatService 扩展扫描范围: |
| 335 | -- 遍历 `data/agents/` 下有 `heartbeat.enabled` 的全局 Agent。 | ||
| 336 | -- 遍历 `data/companies/*/agents/` 下有 `heartbeat.enabled` 的公司内 Agent。 | ||
| 337 | -- 可以在 `company.json` 层级设置整个公司的心跳开关。 | 510 | +- 遍历 `data/agents/` 下有 `heartbeat.enabled` 的全局 Agent(如 master)。 |
| 511 | +- 遍历每个 `data/{companyId}/` 下,读取 `company.json` 的心跳配置。 | ||
| 512 | +- 若公司心跳开启,唤醒该公司的 CEO 作为入口(CEO 自行决定唤醒下属)。 | ||
| 338 | 513 | ||
| 339 | --- | 514 | --- |
| 340 | 515 | ||
| 341 | -## 七、实现计划 — Todo List | 516 | +## 八、实现计划 — Todo List |
| 517 | + | ||
| 518 | +### Phase 1: 数据结构 + 模板库基础 | ||
| 519 | + | ||
| 520 | +- [ ] **1.1** 创建 `data/templates/` 目录,迁移现有 Agent 为模板(ceo, qa-judge 等) | ||
| 521 | +- [ ] **1.2** 实现 `company-service.js`:Company CRUD (create / get / list / shutdown) | ||
| 522 | +- [ ] **1.3** 实现 `resolveAgentDir(companyId, agentId)` 统一寻址函数 | ||
| 523 | +- [ ] **1.4** 实现 `_registry.json` 模板注册表,记录模板的 benchmarkScore、usedCount | ||
| 342 | 524 | ||
| 343 | -### Phase 1: 数据结构基础 | 525 | +### Phase 2: Agent 招聘系统 (Hiring Pipeline) |
| 344 | 526 | ||
| 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` 上下文 | 527 | +- [ ] **2.1** 实现 `POST /api/company/:id/hire` — 模板查找 → 复制 → 上下文注入 |
| 528 | +- [ ] **2.2** 招聘兜底:模板不存在时自动调用 `agent-creator` 创建 + `innovator` FDE 训练 | ||
| 529 | +- [ ] **2.3** Benchmark 质量门禁:评分 ≥ 95 才允许上岗,不合格自动 re-evolve | ||
| 530 | +- [ ] **2.4** 训练合格后自动沉淀骨架到 `templates/`,更新 `_registry.json` | ||
| 349 | 531 | ||
| 350 | -### Phase 2: CEO 自动建制 | 532 | +### Phase 3: CEO 自动建制 + OKR |
| 351 | 533 | ||
| 352 | -- [ ] **2.1** 实现 `POST /api/company/:id/hire-ceo`(调用 agent-creator 并自动填充上下文) | ||
| 353 | -- [ ] **2.2** CEO 的 `agent.md` 模板:包含公司使命、员工创建权限、SOP 设计权限 | ||
| 354 | -- [ ] **2.3** CEO 首次运行后自动规划(通过 TaskDispatch 触发"规划战略并组建团队") | 534 | +- [ ] **3.1** 公司创建后自动招聘 CEO(从模板),CEO agent.md 注入公司使命 |
| 535 | +- [ ] **3.2** CEO 首次运行后自主规划:确定角色需求 → 批量调用 hire API → 创建 OKR | ||
| 536 | +- [ ] **3.3** GoalsService 改造:所有 OKR 存储在 `data/{companyId}/goals/` 下 | ||
| 355 | 537 | ||
| 356 | -### Phase 3: SOP 流水线 | 538 | +### Phase 4: SOP 流水线 |
| 357 | 539 | ||
| 358 | -- [ ] **3.1** 设计 Pipeline 数据结构(`pipelines/*.json`) | ||
| 359 | -- [ ] **3.2** 实现 Pipeline 执行引擎(按步骤自动触发对应 Agent) | ||
| 360 | -- [ ] **3.3** CEO 可以通过工具动态调整 Pipeline | 540 | +- [ ] **4.1** 设计 Pipeline 数据结构(`{companyId}/pipelines/*.json`) |
| 541 | +- [ ] **4.2** 实现 Pipeline 执行引擎(按步骤自动触发公司内对应 Agent) | ||
| 542 | +- [ ] **4.3** CEO 可以通过工具动态调整 Pipeline | ||
| 361 | 543 | ||
| 362 | -### Phase 4: 前端 Dashboard | 544 | +### Phase 5: 前端 Dashboard |
| 363 | 545 | ||
| 364 | -- [ ] **4.1** 公司列表页(展示所有公司卡片 + 运行状态) | ||
| 365 | -- [ ] **4.2** 公司详情页(组织架构图 + OKR 大盘 + Agent 列表) | ||
| 366 | -- [ ] **4.3** 公司日报/周报自动生成与展示 | 546 | +- [ ] **5.1** 公司列表页(展示所有公司卡片 + 运行状态 + 员工数) |
| 547 | +- [ ] **5.2** 公司详情页(组织架构图 + 公司 OKR 大盘 + Agent 列表 + 招聘状态) | ||
| 548 | +- [ ] **5.3** 模板库页面(展示所有可用模板、评分、使用次数) | ||
| 549 | +- [ ] **5.4** 公司日报/周报自动生成与展示 | ||
| 367 | 550 | ||
| 368 | --- | 551 | --- |
| 369 | 552 | ||
| 370 | -## 八、关键技术决策 | 553 | +## 九、关键技术决策 |
| 371 | 554 | ||
| 372 | | # | 问题 | 决策 | 说明 | | 555 | | # | 问题 | 决策 | 说明 | |
| 373 | |---|------|------|------| | 556 | |---|------|------|------| |
| 374 | -| 1 | Agent ID 全局唯一还是公司内唯一? | **全局唯一** | 使用 `{role}-{companySlug}` 命名法,如 `ceo-wechat` | | ||
| 375 | -| 2 | 原有的 `data/agents/ceo` 怎么处理? | **渐进迁移** | 旧的全局 Agent 保留不动,新建公司时在 companies 下创建 | | ||
| 376 | -| 3 | Company 的 CEO 是新建还是复用? | **每家公司新建独立 CEO** | 避免记忆污染和注意力分散 | | 557 | +| 1 | Agent ID 全局唯一还是公司内唯一? | **公司内唯一** | 如 ceo 在每家公司内都叫 ceo,通过 companyId + agentId 联合定位 | |
| 558 | +| 2 | 原有 `data/agents/` 里的 Agent | **迁移为模板** | ceo、qa-judge 等迁入 `data/templates/`,master/innovator 保留为全局 | | ||
| 559 | +| 3 | 招聘时模板不存在怎么办? | **agent-creator 创建 + innovator 训练到 ≥95** | 训练合格后自动沉淀为新模板,下次复用 | | ||
| 377 | | 4 | Company 可以嵌套 Company 吗? | **v1.0 不支持** | 先做单层,未来有需求再做集团架构 | | 560 | | 4 | Company 可以嵌套 Company 吗? | **v1.0 不支持** | 先做单层,未来有需求再做集团架构 | |
| 378 | -| 5 | 跨公司 Agent 共享(如 innovator)| **全局 Agent 池** | `data/agents/` 下的 Agent 可以被任何公司调用 | | ||
| 379 | -| 6 | 公司的"关停"语义 | **软关停** | 标记 status=shutdown,停止心跳,保留数据 | | 561 | +| 5 | 跨公司 Agent 共享(如 innovator) | **全局 Agent 池** | `data/agents/` 下的 Agent 可被任何公司调用 | |
| 562 | +| 6 | 公司的"关停"语义 | **软关停** | status=shutdown,停止心跳,保留数据 | | ||
| 563 | +| 7 | Goals/OKR 作用域 | **全部归属 Company** | 不设全局 OKR,每个目标都隶属于一个具体公司 | |