ColeMurray/background-agents
GitHub: ColeMurray/background-agents
一个开源的后台 AI 编码代理系统,支持通过 Slack、GitHub、Linear 等渠道触发自主编码任务并在沙箱中执行。
Stars: 2464 | Forks: 355
# 后台代理:Open-Inspect
一个受
[Ramp 的 Inspect](https://builders.ramp.com/post/why-we-built-our-background-agent) 启发的开源后台代理编码系统。
## 概述
Open-Inspect 提供了一个托管的后台编码代理,能够:
- 在后台处理任务,同时您可以专注于其他事情
- 访问完整的开发环境(Node.js、Python、git、浏览器自动化、VS Code)
- 从任何地方连接 — Web UI、Slack、GitHub PR、Linear issue 或 webhook
- 实现多人协作会话,让多人可以实时协作
- 创建具有适当提交归属权的 PR,归因于发起提示的用户
- 按计划运行 — cron 作业、Sentry 警报和 webhook 触发的自动化
- 启动并行子任务,同时在独立的沙箱中工作
- 使用您选择的 AI 模型 — Anthropic Claude、OpenAI Codex(通过 ChatGPT 订阅)或
OpenCode Zen
## 安全模型(仅限单租户)
### 工作原理
系统使用共享的 GitHub App 安装来进行 git 操作(clone、fetch、push)。控制
平面在服务器端生成短期安装 token,并根据需要通过 git credential helper 将它们代理给沙箱。这意味着:
- **所有用户共享相同的 GitHub App 凭据** - GitHub App 必须安装在您
组织的仓库中,并且系统的任何用户都可以访问该 App 有权访问的任何 repo
- **无基于用户的仓库访问验证** - 系统不会在创建会话前验证
用户是否有权访问特定仓库
- **GitHub 用户的 OAuth token 用于创建 PR** - 对于 GitHub 登录,使用
用户的 GitHub OAuth token 创建 PR,确保正确的归属权,并且他们只能在
拥有写入权限的 repo 上创建 PR。通过其他方式(例如 Google)登录的用户没有 SCM token,
因此他们的 PR 会回退到共享的 GitHub App bot
### Token 架构
| Token 类型 | 用途 | 范围 |
| ------------------ | -------------------------------------- | -------------------------------- |
| GitHub App Token | 代理的 git clone/fetch/push 授权 | 安装了 App 的所有 repo |
| User OAuth Token | 创建 PR,用户信息 | 用户有权访问的 repo |
| Sandbox Auth Token | 沙箱到控制平面的会话调用 | 单个会话 |
| WebSocket Token | 实时会话授权 | 单个会话 |
### 为什么仅限单租户
此架构遵循
[Ramp 的 Inspect 设计](https://builders.ramp.com/post/why-we-built-our-background-agent),该设计
是为内部使用而构建的,其中所有员工都受信任并且可以访问公司仓库。
**对于多租户部署**,您需要:
- 每个租户的 GitHub App 安装
- 在创建会话时进行访问验证
- 数据模型中的租户隔离
### 部署建议
1. **部署在组织的 SSO/VPN 之后** - 确保只有经过授权的员工才能访问
Web 界面
2. **仅在预期的仓库上安装 GitHub App** - App 的安装范围定义了
系统可以访问的内容
3. **限制登录** - 配置允许的 GitHub 用户、电子邮件域名或活跃的 GitHub
组织成员身份(`ALLOWED_GITHUB_ORGS`)
4. **使用 GitHub 的仓库选择功能** - 安装 App 时,选择特定的仓库
而不是“所有仓库”
## 架构
```
┌──────────────────┐
│ Clients │
│ ┌──────────────┐ │
│ │ Web / Slack │ │
│ │ GitHub / Lin.│ │
│ │ Webhooks │ │
│ └──────────────┘ │
└────────┬─────────┘
│
▼
┌────────────────────────────────────────────────────────────────────┐
│ Control Plane (Cloudflare) │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ Durable Objects (per session) │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌───────────────┐ │ │
│ │ │ SQLite │ │WebSocket│ │ Event │ │ GitHub │ │ │
│ │ │ DB │ │ Hub │ │ Stream │ │ Integration │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ └───────────────┘ │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ D1 Database (repo-scoped secrets) │ │
│ └──────────────────────────────────────────────────────────────┘ │
└────────────────────────────────┬───────────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────────────────┐
│ Data Plane (Sandbox Backend) │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ Session Sandbox │ │
│ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │
│ │ │ Supervisor│──│ OpenCode │──│ Bridge │─────────────────┼──┼──▶ Control Plane
│ │ └───────────┘ └───────────┘ └───────────┘ │ │
│ │ │ │ │
│ │ Full Dev Environment │ │
│ │ (Node.js, Python, git, agent-browser) │ │
│ └──────────────────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────────────────┘
```
## 包
| 包 | 描述 |
| ------------------------------------------------- | ------------------------------------------- |
| [control-plane](packages/control-plane) | Cloudflare Workers + Durable Objects |
| [web](packages/web) | Next.js Web 客户端 |
| [sandbox-runtime](packages/sandbox-runtime) | 共享的沙箱内 agent 运行时 |
| [modal-infra](packages/modal-infra) | Modal 沙箱基础设施 |
| [daytona-infra](packages/daytona-infra) | Daytona 快照基础设施 |
| [opencomputer-infra](packages/opencomputer-infra) | OpenComputer 模板基础设施 |
| [slack-bot](packages/slack-bot) | Slack 集成(从消息创建会话) |
| [github-bot](packages/github-bot) | GitHub 集成(自动审查、@mention) |
| [linear-bot](packages/linear-bot) | Linear 集成(issue → 编码会话) |
| [shared](packages/shared) | 共享的类型和实用工具 |
## 快速入门
有关实用的设置指南(本地 + 贡献者 + 部署路径),请从
**[docs/SETUP_GUIDE.md](docs/SETUP_GUIDE.md)** 开始。
请参阅 **[docs/GETTING_STARTED.md](docs/GETTING_STARTED.md)** 获取部署说明。
要了解架构和核心概念,请阅读
**[docs/HOW_IT_WORKS.md](docs/HOW_IT_WORKS.md)**。
要设置定期计划任务,请参阅 **[docs/AUTOMATIONS.md](docs/AUTOMATIONS.md)**。
## 核心功能
### 快速启动
通过多层预热,会话几乎可以立即启动:
### 多人会话
多个用户可以在同一个会话中进行协作:
- 在线状态指示器显示谁处于活跃状态
- 提示在 git 提交中归属于其作者
- 向所有连接的客户端进行实时流式传输
### 提交归属权
提交归属于发送提示的用户:
```
// Configure git identity per prompt
await configureGitIdentity({
name: author.scmName,
email: author.scmEmail,
});
```
### 客户端集成
从您的团队已经工作的任何地方与 agent 交互:
- **Web UI** — 完整的会话管理,具备实时流式传输、模型/推理选择器、终端
面板和多人在线状态
- **Slack Bot** — @mention 或 DM 以启动会话;回复以结果的形式串联回来。通过 App Home 实现
基于用户的模型和分支偏好。请参阅 [Slack 集成](docs/integrations/SLACK.md)
- **GitHub Bot** — 在 PR 打开时自动审查,或响应 PR 评论中的 @mention。支持按
repo 配置。请参阅 [GitHub 集成](docs/integrations/GITHUB.md)
- **Linear Bot** — 在 issue 上提及或分配 agent 以启动编码会话,发布进度
活动,并链接生成的 PR。请参阅 [Linear 集成](docs/integrations/LINEAR.md)
- **Webhooks** — 通过经过身份验证的 HTTP POST 从任何外部系统触发会话
### 自动化
安排定期任务或响应外部事件 — 无需人工干预:
有关设置说明,请参阅 **[docs/AUTOMATIONS.md](docs/AUTOMATIONS.md)**。
### 沙箱环境
每个会话都在具有完整开发环境的独立沙箱后端中运行:
- **预装:** Node.js 22、Python 3.12、Bun、git、GitHub CLI、build-essential
- **浏览器自动化:** agent-browser CLI 搭配 headless Chromium,用于屏幕截图、视觉 diff
和 UI 验证
- **Code-server:** 连接到会话工作区的可选基于浏览器的 VS Code
- **Web 终端:** 可从会话 UI 访问的由 ttyd 提供支持的终端
- **端口隧道:** 通过加密隧道暴露最多 10 个开发服务器端口。URL 可以在
`.openinspect/start.sh` 运行之前的沙箱内 `/workspace/.tunnels.env` 获取
([详情](docs/HOW_IT_WORKS.md#tunnel-urls-inside-the-sandbox))
- **仓库机密:** AES-256-GCM 加密,按 repo 或全局划分范围,在
生成时作为环境变量注入。支持批量 `.env` 粘贴导入
### 子任务生成
Agent 可以将工作分解为并行的子会话:
- `spawn-task` 在自己的沙箱中创建一个子会话并立即返回
- 父任务继续工作,同时子任务在单独的分支上并行运行
- `get-task-status` 和 `cancel-task` 用于协调
- 强制执行深度限制和每个 repo 的防护机制
### 仓库生命周期脚本
仓库可以在 `.openinspect/` 下定义两个可选的启动脚本:
```
# .openinspect/setup.sh(provisioning)
#!/bin/bash
npm install
pip install -r requirements.txt
```
```
# .openinspect/start.sh(runtime startup)
#!/bin/bash
docker compose up -d postgres redis
```
- `setup.sh` 在镜像构建和全新会话时运行
- 对于 repo-image 和 snapshot-restore 启动,会跳过
`setup.sh`
- `setup.sh` 失败对于全新会话是非致命的,但在镜像构建模式下是致命的
- `start.sh` 在每次非构建会话启动时运行(fresh、repo-image、snapshot-restore)
- `start.sh` 失败是严格的:如果它存在并且失败,则会话启动失败
- 默认超时:
- `SETUP_TIMEOUT_SECONDS`(默认为 `300`)
- `START_TIMEOUT_SECONDS`(默认为 `120`)
- 两个 hook 都会接收 `OPENINSPECT_BOOT_MODE`(`build`、`fresh`、`repo_image`、`snapshot_restore`)
- 当共享安装具有访问权限时,hook 中的 git 操作可以对配置的 SCM 主机上的
其他私有 repo 进行身份验证
## 许可证
MIT
标签:MITM代理, 程序员工具, 自动化攻击, 逆向工具