Files
boss/docs/technical-selection.md
2026-03-23 12:43:39 +08:00

315 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Boss 技术选型建议
更新日期2026-03-23
## 选型原则
- 先保证系统能跑,再追求最优雅
- 持久状态优先于纯内存编排
- 结构化事件优先于拼字符串日志
- 尽量复用成熟 agent 运行时,而不是自己重写编码 agent
## 总体选型建议
| 层 | 推荐 | 备选 | 原因 |
|---|---|---|---|
| 前端控制台 | Next.js | Remix, Nuxt | 适合快速做管理台和流式 UI |
| Desktop | Tauri | Electron | 后续需要时再补Tauri 更轻 |
| 后端 API | NestJS 或 Fastify | Express, Go Fiber | 结构清晰,适合长期维护 |
| 工作流引擎 | Temporal | Inngest, BullMQ + 自建状态机 | 长任务、中断、审批、恢复是核心需求 |
| 队列/事件 | Redis Streams | NATS, Kafka | MVP 阶段足够轻,开发快 |
| 主数据库 | Postgres | MySQL | 事务、JSON、查询能力更适合控制平面 |
| 缓存 | Redis | KeyDB | 用于会话热数据、限流、事件流 |
| Manager Agent | Codex | Claude API, GPT-5.x Responses | 适合做规划、汇总、重规划 |
| Worker Runtime | Codex CLI + Claude Code | OpenHands agent runtime | 直接复用成熟编码 agent |
| 工具协议 | MCP | 自定义 tool API | 标准化工具接入 |
| 浏览器自动化 | Playwright | Puppeteer | 成熟稳定,适合 agent 使用 |
| 聊天入口 | Slack 或 Telegram | 飞书, 企业微信 | 文档、生态和迭代速度更合适 |
| 身份认证 | Clerk 或 Auth.js | 自建 OAuth | MVP 快速起步 |
| 监控 | OpenTelemetry + Grafana | Datadog, Sentry | 方便追踪任务链路 |
## 为什么推荐这个技术组合
### 1. Next.js 作为控制台前端
原因:
- 适合做 dashboard、对话界面、任务树、设备面板
- 容易做流式更新和服务端渲染
- 与 TypeScript 一体化
不建议现在单独起 React Native
- 当前核心不是移动端,而是 control plane
### 2. NestJS 或 Fastify 作为后端
如果团队偏工程化:
- 选 NestJS
如果你想更轻更快:
- 选 Fastify
建议:
- 先用 Fastify 或 NestJS 中你更熟的那个
- 关键是把服务边界拆干净
### 3. Temporal 作为工作流引擎
这是当前最关键的选型之一。
Boss 不是短请求系统,而是长任务系统。你需要天然支持:
- 几分钟到几小时的任务
- 中途暂停
- 审批等待
- worker 断线重连
- 任务恢复
如果不用工作流引擎,后面会自己补很多分布式状态机逻辑。
如果 MVP 阶段不想上 Temporal
- 可以先用 `BullMQ + Postgres 状态表`
- 但要尽快收敛到真正可恢复的工作流模型
### 4. Postgres 作为主数据库
Boss 的核心不是海量日志,而是:
- 会话
- 任务树
- 审批
- worker 注册
- 状态快照
这些都非常适合 Postgres。
### 5. Codex 作为 manager
原因:
- 你希望主账号持续对话和重规划
- manager 不需要最强本地执行,它更需要任务理解、拆解和汇总
- Codex 在多入口和云任务语境里更契合 manager 角色
推荐职责:
- 规划
- 重规划
- 汇总
- 风险解释
不建议让 manager 干太多底层执行:
- 容易把规划和执行耦合死
### 6. Claude Code / Codex CLI 作为 worker runtime
原因:
- 本地设备执行体验成熟
- 适合接 terminal、filesystem、git、browser
- 真实开发环境兼容性更好
建议策略:
- Mac 和 Windows worker 都先抽象成统一 `executor`
- 底层可配置使用 `codex``claude`
## 服务拆分建议
### 第一阶段服务
- `api-gateway`
- `session-service`
- `task-service`
- `scheduler-service`
- `worker-gateway`
- `notification-service`
### 第二阶段可拆
- `approval-service`
- `memory-service`
- `git-integration-service`
- `chat-connector-service`
## 数据存储建议
### Postgres 表
建议至少有:
- `users`
- `project_sessions`
- `messages`
- `tasks`
- `task_dependencies`
- `worker_nodes`
- `worker_capabilities`
- `worker_assignments`
- `task_events`
- `approval_requests`
- `artifacts`
### Redis 用途
- worker 在线状态
- 事件总线
- UI 实时订阅
- 节流和限流
## Worker 设计建议
### worker 进程结构
组成:
- `boss-worker` 守护进程
- `executor` 适配层
- `tool adapters`
- `sandbox policy`
- `event reporter`
### worker 本地目录策略
建议:
- 一个统一工作根目录
- 每个任务一个独立 workspace
- 每个任务一个独立 git worktree
示例:
```text
~/boss-worker/
repos/
worktrees/
cache/
artifacts/
```
### worker 能力声明
每个 worker 启动时上报:
- OS
- shell
- 是否支持浏览器自动化
- 是否支持特定 IDE
- 是否有移动端模拟器
- 是否具备 repo 热缓存
## 协议选型建议
### MCP
用途:
- 统一工具调用
适合接:
- Git
- 文件系统
- 浏览器
- Issue 系统
- CI
### A2A
用途:
- 中长期用于 agent 之间通信
建议:
- MVP 不强依赖
- 但内部消息模型尽量向 agent-to-agent 协作靠拢
## 前后端通信建议
### 控制台实时能力
推荐:
- WebSocket 或 Server-Sent Events
用途:
- 推送任务状态
- 推送审批请求
- 推送设备在线变化
### worker 连接方式
推荐:
- WebSocket 长连接
原因:
- 需要双向通信
- 需要下发中断和恢复命令
## 安全建议
### 最小权限原则
- worker 不要默认拥有所有仓库权限
- 每种工具调用都要有权限分级
### 高风险动作审批
必须纳入审批的动作:
- 删除大量文件
- 强推分支
- 执行危险 shell
- 访问敏感路径
### 审计
必须记录:
- 谁发起了什么
- 哪个 worker 执行了什么
- 哪个 agent 建议了什么
- 审批前后状态
## 推荐的 MVP 技术栈
### MVP 最稳组合
- 前端Next.js
- 后端NestJS
- 数据库Postgres
- 缓存和事件Redis
- 工作流BullMQ后续升级 Temporal
- ManagerCodex
- WorkerCodex CLI + Claude Code
- 聊天入口Telegram 或 Slack
### 如果你要一步到位更稳
- 前端Next.js
- 后端NestJS
- 数据库Postgres
- 缓存Redis
- 工作流Temporal
- ManagerCodex
- WorkerCodex CLI + Claude Code
- 监控OpenTelemetry
## 不推荐的坑
- 不要一开始就全微服务
- 不要一开始就自研完整 agent runtime
- 不要把聊天平台当成主控制台
- 不要让多个任务共用一个工作目录
- 不要把审批做成“日志里提示一下”而不是显式状态