本地多 Agent 协作工作台
在本机创建长期存在的 AI 同事,和它们在房间里对话。
每个 Agent 在 macOS 沙箱里运行 OpenCode。
Important
Crew 正在用 TypeScript 从零实现,只能从源码运行,只支持 macOS 与本机 OpenCode。Agent 在 Seatbelt 沙箱中运行,但网络不受限制。只在可信的本机环境中使用。旧版 OpenWork(Rust 加 Tauri)的代码已删除,需要时从 git 历史找回。
Electron 主进程(监管者)
├── 界面(React) ── HTTP + SSE ──→ Server(Express)── PostgreSQL
└── Computer ── HTTP + SSE ──→ Server
└── OpenCode(每轮一个进程,在 Seatbelt 中)── crew ──→ Server
- 三个进程都在本机回环地址上通信。Server 是业务数据的唯一写者;Computer 只经 HTTP 访问它,不持有数据库凭证。
- SSE 只推送“哪部分数据变了”,收到的一方重新读取,丢一条提示的代价只是晚一点刷新。
- 全部用 TypeScript:protocol 包用 zod 定义接口契约,Server 按它注册路由,界面与 Computer 按它调用并校验响应;改一个字段,两边一起在类型检查中报错。
- macOS;
- Node.js 24 与 pnpm 10;
- Docker(用来运行 PostgreSQL);
opencodeCLI:已安装、已登录,能在终端运行opencode models。
git clone https://github.com/Aaron-Ben/OpenWork.git
cd OpenWork
cp .env.example .env
pnpm installdocker compose up -d --wait
pnpm devpnpm dev 打开 Crew 的窗口。第一次启动时,Server 自动执行数据库迁移。本地服务的检查与重建见 docs/local-services.md。
pnpm check # lint、类型检查、测试与冒烟测试
CREW_E2E_MODEL=<OpenCode 中的模型> pnpm test:e2e # 用真实模型跑完整链路
pnpm preview:shot --theme dark # 给界面截图- 冒烟测试运行构建后的应用:启动构建好的 Server 与 Computer,假的 opencode 在沙箱里经构建好的
crew回复,断言回复写进数据库。 - 测试规则见 docs/testing.md。
| 边界 | 当前行为 |
|---|---|
| 文件 | OpenCode 在 Seatbelt 中运行:只能写自己的目录与临时目录;$HOME 之内只能读自己的目录(agent-runtime.md)。沙箱自检失败时不启动任何 Agent |
| 身份 | 每个 Agent 有自己的凭证,只能以自己的身份、在自己所在的房间里发言。凭证只在本次运行内有效 |
| 网络 | 不限制。模型请求发往 OpenCode 配置的服务商 |
| 服务商凭证 | 由 OpenCode 管理。Crew 只在启动 Agent 时读取 OpenCode 的登录文件并传给它,不另外保存 |
以 Apache License 2.0 开源。