内容
# 代理网格 — meshfleet.app
> **可审计的多代理协调**,适用于OpenCode。启动并行代理作为独立的操作系统进程。向专家路由工作。让代理之间进行对等协作 — 通过见证收据和法定人数批准,这样您就可以回答:*谁看到了这个,谁批准了它,证明它。* 核心是MIT许可的,并且是免费的。
**网站**:[meshfleet.app](https://meshfleet.app) · **版本**:0.11.1 · **测试**:209/209 通过 · [CI](https://github.com/johnmwhitman/agent-mesh/actions)
> **项目状态 — 故意预1.0,积极维护。** 版本发布故意不频繁(我们会在有值得发布的内容时发布版本,而不是按照日历);仓库保持每月维护心跳,问题在48小时内得到首次回应。
>
> **边界,作为一种契约:** 机制是免费的,并且保持免费 — 协调,收据,委员会和运行验证的能力是MIT许可的,永远免费。加密**签名**和审计员级证明是付费层([meshfleet-pro](https://meshfleet.app/pro));签名永远不会进入这个核心。开发人员的问题(*发生了什么?*)在这里得到回答;审计员的问题(*有人可以更改这个吗?*)是您付费的内容。
>
> **主机可移植性:** 这是一个代理审计轨迹,**OpenCode优先** — 不是一个OpenCode独有的想法。核心是一个标准的MCP服务器;更广泛的主机支持跟踪实际需求。
---
## 为什么选择Meshfleet?
OpenCode是一个单代理运行时。您与它对话,它会执行操作。当您需要**多个专家**并行运行 — 探索,然后审查,然后实施 — 您就会遇到30分钟的后台任务超时。
Meshfleet添加了缺失的层:一个由代理组成的舰队,它们并行运行,相互通信,移交工作,并自我组织。作为独立的操作系统进程,而不是后台任务。没有人为限制。
```typescript
const { fleet_id } = await callTool("spawn_fleet", {
agents: [
{ role: "探索者", prompt: "映射身份验证层", agent: "代码库-入职工程师" },
{ role: "分析师", prompt: "审查架构", agent: "甲骨文" },
{ role: "工程师", prompt: "实施JWT刷新", agent: "后端架构师" },
],
});
```
三个专家。三个独立的进程。它们移交,提问,提醒问题。您读取结果。
当代理的操作很重要时,Meshfleet可以证明发生了什么。每个消息都会写入**每个收件人的收据**(已交付,已查看,已确认)。决策可以通过**委员会** — 基于法定人数的批准,带有必需的签名,在同一账本上记录。设计是总线的端口,该总线在生产中运行了10多个代理舰队,持续40天,发送了18,404条消息,包括法定人数批准的决策。
---
## 30秒安装
从npm(包名为`meshfleet`;`agent-mesh` npm名称被占位符占用):
```bash
npm install -g meshfleet
```
或从源代码:
```bash
git clone https://github.com/johnmwhitman/agent-mesh.git \
~/.config/opencode/mcp-servers/agent-mesh
cd ~/.config/opencode/mcp-servers/agent-mesh
npm install && npm run build
```
添加到 `~/.config/opencode/opencode.jsonc`(npm安装):
```jsonc
{
"mcp": {
"agent-mesh": {
"type": "local",
"enabled": true,
"command": ["npx", "meshfleet"]
}
}
}
```
或,如果您从源代码构建:
```jsonc
{
"mcp": {
"agent-mesh": {
"type": "local",
"enabled": true,
"command": ["node", "~/.config/opencode/mcp-servers/agent-mesh/dist/index.js"]
}
}
}
```
重启OpenCode。启动一个舰队。[完整安装指南 →](docs/install)
---
## CLI
安装Meshfleet后,`agent-mesh` CLI为您提供运行中的舰队的终端可见性,`agent-mesh-dashboard`为您提供实时的TUI。
```bash
$ npx agent-mesh inspect
3 个舰队:
bc34d339-935c-4… 完成 3 个代理,3 个完成(34.8m)
37ae1cf2-5ce8-4… 完成 1 个代理,1 个完成(28.2m)
d648beb0-cfb2-4… 失败 2 个代理,2 个完成(27.3s)
$ npx agent-mesh inspect --metrics
总舰队: 7
已完成: 3
失败: 4
总代理: 16
成功率: 42.9%
平均时长: 1.34s
$ npx agent-mesh inspect --events 5
时间戳 事件 详情
──────────────────────────────────────────────────────────────────────
2026-07-02 12:40:12 agent_spawned 舰队=f-1 代理=a-1
2026-07-02 12:40:12 agent_spawned 舰队=f-1 代理=a-2
2026-07-02 12:40:12 fleet_created 舰队=f-1
```
---
## 25 个 MCP 工具
**舰队**
| 工具 | 功能 |
|---|---|
| `spawn_fleet` | 启动N个并行代理作为独立的操作系统进程 |
| `spawn_from_template` | 从保存的模板启动一个舰队 |
| `save_fleet_template` / `list_fleet_templates` | 可重用的,版本化的舰队配置 |
| `list_fleets` / `fleet_status` | 所有舰队,或一个舰队的完整状态 |
| `collect_results` | 收集每个代理的最终输出在一个调用中 |
| `set_fleet_timeout` | 舰队超时覆盖(毫秒) |
| `attach_agent` | 动态附加一个预制的代理到正在运行的舰队 |
**消息和收据**
| 工具 | 功能 |
|---|---|
| `send_message` | 对等消息(5种类型)— 或 `to_agent_id: "*"` 广播到整个舰队 |
| `get_inbox` / `ack_message` | 轮询和确认;每个确认写入一个收件人收据 |
| `subscribe_inbox` | 通过SSE而不是轮询推送交付 |
| `receipt` / `get_receipts` | 编写和查询见证交付账本:谁看到了什么,何时 |
**委员会(法定人数批准)**
| 工具 | 功能 |
|---|---|
| `open_ratification` | 将决策提交给舰队:法定人数大小,截止日期,所需签名 |
| `cast_vote` | 代理投票,记录在案 |
| `tally_ratification` / `sweep_ratifications` | 解决结果;过期过去截止日期的投票 |
**路由和运维**
| 工具 | 功能 |
|---|---|
| `register_capability` | 自我描述角色 + 技能用于路由 |
| `route_work` | 根据关键词 + 角色重叠将任务匹配到最佳代理 |
| `record_routing_outcome` | 反馈结果以改进路由 |
| `list_agents` | 发现100+预制代理角色 |
| `get_health` / `ping` | 舰队健康状况和活跃度 |
这是25个。我们这次数了两次。
[完整API参考 →](docs/api)
---
## 5种消息类型
| 类型 | 用途 |
|---|---|
| `移交` | 将上下文传递给管道中的下一个代理 |
| `问题` | 提出一个澄清问题(带有可选的`correlation_id`) |
| `结果` | 报告最终结果 |
| `警报` | 向所有舰队对等方广播问题 |
| `请求帮助` | 在遇到瓶颈时升级(针对具有相关技能的特定对等方) |
64 KB有效载荷上限。默认编码是JSON,但有效载荷是字符串 — 发送任何您想要的内容。广播(`to_agent_id: "*"`) 分发到每个舰队对等方,每个收件人独立确认 — 收据账本显示谁确实看到了它。
---
## 4种协作模式
- **管道移交**:A → B → C。每个专家将上下文移交给下一个。循环中没有协调器。
- **辩论共识**:A和B审查相同的工件,通过问题进行辩论,在报告之前达成一致。
- **故障恢复**:C遇到阻塞,广播`alert`,具有相关技能的对等方用修复程序响应。
- **批准的决策**:委员会对风险操作进行投票 — 法定人数,截止日期,所需签名 — 结果(包括谁保持沉默)记录在账本上。
[更多用例 →](https://meshfleet.app/use-cases)
---
## 比较
| 工具 | 最适合 | 权衡 |
|---|---|---|
| **OpenCode `task()`** | 单任务工作 | 30分钟超时,无对等 |
| **LangGraph** | Python图形应用 | 仅限Python,托管优先 |
| **CrewAI** | 基于角色的Python代理 | 仅限Python,托管 |
| **AutoGen** | 研究项目 | 复杂,仅限Python |
| **手动编写的cron** | 特定的一次性工作流 | 没有共享抽象 |
| **Meshfleet** | OpenCode + 多代理,本地优先,可审计 | 仅限TypeScript(目前) |
它们都没有回答“谁看到了这个,谁批准了它,证明它。” 那是我们的定位。
[完整比较 →](https://meshfleet.app/comparison)
---
## 架构
```
src/
├── db.ts # 具有SQLite的withLedger事务边界(写入边界)
├── core.ts # 数据层:账本,消息,收据,功能,事件
├── migrate.ts # 一次性JSON→SQLite迁移(启动时运行一次)
├── ratify.ts # 委员会:账本上的法定人数批准
├── templates.ts # 版本化的舰队模板
├── routing-feedback.ts # 结果导向的工作路由
├── health.ts # 舰队健康评分
├── realtime.ts # SSE推送交付(subscribe_inbox)
├── inspector.ts # CLI输出的纯格式化程序
├── index.ts # MCP服务器:传输 + 工具处理程序
└── bin/
├── inspect.ts # CLI:npx agent-mesh inspect
└── dashboard.ts # 实时TUI:npx agent-mesh-dashboard
```
每次写入都经过 **一个** 函数 — `withLedger(mutator)` in `db.ts` — 它在单个SQLite `BEGIN IMMEDIATE`事务中运行突变。代理是真正的操作系统进程,每个代理在其自己的agent-mesh实例上启动在同一个账本上,因此写入是真正并发的; SQLite(WAL + `busy_timeout`)提供跨进程写入排除,因此此代码库不拥有任何锁定协议,丢失更新在构造过程中是不可能的。(较早的JSON读取-修改-写入存储在两进程测试下默默丢失了57个收据中的120个;SQLite缝隙通过相同的测试200/200。)读取者使用无锁`readLedger()`。纯格式化程序位于`inspector.ts` — 易于测试,无I/O。
账本位于 `~/.config/opencode/agent-mesh.db`(SQLite);事件日志位于 `~/.config/opencode/agent-mesh.events.log`(NDJSON)。随时使用 `npx agent-mesh inspect --export` 将账本转储为人类可读的JSON。在从JSON账本升级后首次运行时,服务器会一次性迁移它(经过验证,并保留一个`.migrated.<ts>`备份)。
[完整规范 →](AGENT-MESH-SPEC.md) · [对等消息规范 →](SPEC-P2P.md)
---
## 要求
- Node.js >= 20
- OpenCode CLI在 `$PATH`(OpenCode支持的任何模型提供程序)
- 就这样
---
## 许可证
核心是MIT许可的 — 使用它,分叉它,在您的产品中发布它。除了许可证文件外,不需要任何署名。(一个商业担保层,[Meshfleet Pro](https://meshfleet.app/pro),位于一个单独的仓库中,不会更改此处的内容。)
---
## 贡献
参见 [CONTRIBUTING.md](./CONTRIBUTING.md)。错误 → [问题](https://github.com/johnmwhitman/agent-mesh/issues)。安全 → [SECURITY.md](./SECURITY.md)。路线图 → [ROADMAP.md](./ROADMAP.md)。