每天一个开源项目#61 3.9K Stars:Cloudflare 给 Agent 一台持久云电脑

每天一个开源项目#61 3.9K Stars:Cloudflare 给 Agent 一台持久云电脑

GitHub Trending 第 1 名 |快照日期:2026-08-06|3,913 Stars184 Forks|TypeScript|MIT

项目地址:github.com/cloudflare/...

📋 项目概览

项目 信息
项目名 cloudflare/computer(Cloudflare Computer)
一句话定位 为云端 Agent 提供 SQLite 持久文件系统,并以统一接口接入容器、Worker Shell 和隔离 JavaScript 三类执行后端
Trending 排名 今日第 1 / 共 13 个项目
Stars / Forks 3,913 / 184(Trending 快照)
Open Issues GitHub API 为 24,补充核对其中 4 个为开放 PR,约 20 个为开放 Issue
创建 / 最近推送 2026-06-05 / 2026-08-05
主要语言 TypeScript 94.7%、JavaScript 3.3%、Shell 2.0%
License MIT
版本状态 npm latest 为 0.1.1;审计时 main/packages/computer/package.json 仍为 0.1.0-alpha.1;无 GitHub Release 页面记录,但已有 v0.1.1 Tag
成熟度 Preview Only:官方明确只建议实验、探索和原型,不适合生产

数据口径说明: Stars、Forks、排名和语言占比来自 2026-08-06 Trending 任务快照;版本、贡献者、PR 与源码结构来自同日 API/源码补充核验。快照没有保存"今日新增 Stars",因此本文不会把 Trending 排名倒推成虚构的日增量。

🔥 为什么值得关注

Agent 不只是需要一组 API,它往往还需要一块可以反复读写的"工作台":保存计划、代码、下载文件和中间产物,运行 git、测试、构建工具,再把结果交给下一轮推理。传统做法通常把这些能力拼在临时容器、对象存储和数据库之间;容器被回收后状态容易丢失,直接挂磁盘又很难复制、迁移和按用户隔离。

Cloudflare Computer 的关键变化,是把持久状态执行环境 解耦:Durable Object 内的 SQLite 虚拟文件系统才是权威数据源,容器或隔离 Worker 只是可替换的执行面。Agent 可以用同一套 workspace.fs 管文件,再通过 workspace.runtime.exec() 决定本次任务需要完整 Linux、轻量 Shell,还是带结构化输入输出的 JavaScript 隔离环境。

这比"再封装一个 Agent 工具集"更有系统价值。它真正处理的是 Agent 基础设施最难的边界问题:状态如何跨重启保留、文件如何增量同步、不同执行后端如何共享工作目录、长任务怎样流式输出,以及隔离能力与执行权限如何划分。需要强调的是,它目前仍是 Cloudflare 平台上的预览组件,而不是通用本地虚拟机,也不是可以直接投入生产的多租户沙箱产品。

🏗️ 核心特性

1. SQLite 是权威文件系统,而不是旁路元数据

workspace.fs 提供接近 node:fs/promises 的异步接口,覆盖 readFilewriteFilemkdirreaddirrmgrep 等操作。数据位于 Durable Object 自己的 SQLite 中,因此 DO 重启后仍可恢复;Workspace 也可以完全不配置执行后端,只作为约 10 GB 上限的持久文件系统使用。

源码中的核心表不是简单的"路径---内容"键值表,而是 inode 风格设计:

  • vfs_nodes:文件、目录、符号链接的 inode 元数据;
  • vfs_dirents:父 inode 与名称到子 inode 的映射;
  • vfs_chunks:文件的分块顺序;
  • vfs_blobs / vfs_blob_bytes:以 SHA-256 寻址的块元数据与字节;
  • vfs_changes:删除操作留下的 tombstone;
  • _vfs_watermark / _vfs_fetch_cursor:增量同步游标。

这种设计带来两个直接收益:本地 rename 只需修改目录项,硬链接也能自然表达;相同文件块只保存和传输一次。它不是把 SQL 数据库伪装成磁盘那么简单,而是在为 Agent 工作目录设计一套可同步的内容寻址 VFS。

2. 三种执行后端,共用一个 runtime.exec()

后端 source 的含义 文件访问路径 适合任务 主要代价
Container Shell 命令 computerd 通过 FUSE 挂载容器侧 VFS,并与 DO 双向同步 原生二进制、包管理器、网络、完整 Linux 工具链 冷启动更慢;存在同步成本;权限面最大
Worker Shell just-bash 命令 每次文件操作通过 Workers RPC 直达权威 Workspace grep、文本处理、轻量 Git 与短命令 不是真实 Linux,命令兼容范围有限;不能按 ID 重连
Worker JavaScript ECMAScript 模块 Dynamic Worker 获得 Workspace 支持的 node:fs/promises 结构化输入输出、受控 JS 自动化、可信模块调用 依赖实验性 Worker Loader;不是任意 Node 环境

统一入口看似只是 API 收敛,实际价值在于调度策略:Agent 可以把便宜、快速的文本操作放进 Worker Shell,把需要 pandoc、编译器或系统包的任务路由到容器,把需要结构化返回值的逻辑交给 JavaScript 后端。同一个 Workspace 还能注册多个稳定 ID,并按调用选择:

ts 复制代码
const grep = await ws.runtime.exec("grep -r TODO /workspace", {
  backend: "shell",
});

const build = await ws.runtime.exec("npm test", {
  backend: "sandbox",
});

后端会在首次 execpushpullready(id) 时惰性连接,避免没有任务时提前支付启动成本。

3. 512 KiB 内容寻址分块,只同步真正缺失的字节

容器后端存在两份文件树:DO 侧 SQLite 是持久真相,容器侧是 computerd 的进程生命周期数据库并通过 FUSE 暴露为真实目录。两边各自维护单调递增 revision,典型命令链路如下:

  1. DO 将容器尚未见过的变更按路径合并,连续五次改写同一路径只发送最终状态;
  2. 文件按固定 512 KiB 分块,变更项只携带 (hash, size),不内嵌字节;
  3. 接收端先用 hasObjects 告知已有哈希,发送端只补传缺失块;
  4. 容器执行命令,FUSE 写入被记录为新的容器 revision;
  5. 命令结束后,DO 以最多 256 个变更项一批拉取,补齐缺失块并提交 SQLite;
  6. (rev, path) 游标在每个已提交批次后推进,崩溃重试最多重做一个批次。

协议借鉴了 Git 的 have/want 思路,但同步的是"当前文件树",不是提交历史。它选择 final-state + tombstone,而不是重放 rename 等操作日志,从而让冷启动、重试和幂等收敛遵循同一套规则。

4. 为 Agent 准备的工具、Git 和产物出口

@cloudflare/computer/tools 可直接生成 AI SDK 工具,默认包含 readwriteeditls,配置后再加入 execpublish。读取工具支持最大字节数和行数限制,流式执行结果还能转换成 SSE,避免长命令结束前 Agent 和前端完全失去反馈。

Git 不是必须依赖 Shell:项目通过 isomorphic-git 直接操作 SQLite VFS,并把 pako 替换为 Workers 的 node:zlib;只有导入 @cloudflare/computer/git 时才加载这部分依赖。文件可以通过 R2 预签名链接分享,也能以 session 前缀隔离后发布到 Cloudflare Artifacts。

5. 明确处理长连接生命周期和失败恢复

README 特别提醒:Workers RPC 不会自动回收远端 stub。长会话需要对 getWorkspace()runtime.exec() 返回值使用 using,否则远端对象会一直积累到会话结束。源码中还有 stub soak 测试,能直接观察"不释放"时每轮累积的 Workspace 与 Exec Handle stub。

命令完成但回拉失败时,结果会标记同步为 pending。应用可配置 SyncRetryScheduler,借助 Durable Object alarm 做有界指数退避;项目没有擅自接管应用的 alarm。这个边界虽然增加了接入工作,却比隐藏失败更可靠。

🔬 技术架构深度解析

总体架构

text 复制代码
                       Cloudflare Worker / Agent
                                │
                     getWorkspace(DO Stub)
                                │ Workers RPC
                                ▼
┌──────────────────── Durable Object ────────────────────┐
│ Workspace                                               │
│ ├─ fs / git / tools                                     │
│ ├─ runtime.exec(source, { backend })                    │
│ └─ SQLite VFS(持久、权威状态)                         │
│    ├─ nodes + dirents:命名空间                         │
│    ├─ chunks → SHA-256 blobs:文件内容                  │
│    └─ revisions + cursors + tombstones:增量同步        │
└───────────────┬──────────────────┬──────────────────────┘
                │                  │
        capnweb WebSocket      Workers RPC / Loader
        push → exec → pull          │
                │                  ├───────────────┐
                ▼                  ▼               ▼
      ┌─────────────────┐  ┌──────────────┐  ┌────────────────┐
      │ Container       │  │ Worker Shell │  │ Worker JS      │
      │ computerd       │  │ just-bash    │  │ ES Module      │
      │ memory DB       │  │ 直接读权威 FS│  │ 结构化输入输出 │
      │ FUSE /workspace │  └──────────────┘  └────────────────┘
      │ Linux / network │
      └─────────────────┘

这里最值得注意的是:三类后端的"共享文件系统"并不采用同一种实现。容器需要真实 FUSE 目录,所以维护第二份状态并执行 push/pull;两个 Worker 后端直接通过 RPC 访问权威 Workspace,不需要额外存储和同步往返。这避免了为 API 统一而强行统一底层机制。

容器同步的数据面

text 复制代码
DO mutation
   │ bump rev
   ▼
coalesceChanges(after pushRev) ── 每路径保留最终状态
   │
   ├─ ChangeEntry:path / type / mode / mtime / chunk hashes
   └─ hasObjects(hashes) → pushObjects(missing)
                              │
                              ▼
                     computerd SQLite VFS
                              │ FUSE
                              ▼
                       Linux command writes
                              │
fetchChanges(after {rev,path})
   │ 每批最多 256 项
   ├─ 查询本地已有 blobs
   ├─ fetchObjects(missing)
   ├─ transactionSync 写入
   └─ 提交后推进 cursor

固定分块非常适合追加、尾部改写和重复依赖,但对文件头插入不友好:前面插入一个字节会让后续所有固定边界偏移,导致大量块哈希变化。文档讨论了 FastCDC / buzhash 等内容定义分块,但当前源码仍是固定 512 KiB,不能把规划当成已实现特性。

一致性与并发边界

单个 Durable Object 内的写入由平台 input gate 和 Workspace 队列串行化;同步批次可以原子或幂等重试。但两个容器同时改同一路径时,项目采用同步粒度的最后写入者获胜:没有 CRDT、文件锁或三方合并,也不会提示其中一方内容被覆盖。

因此它适合"一 Workspace、一个活动写者",或多个 Agent 各写独立子目录;不适合多个 Agent 并发更新共享 PLAN.md、计数器或日志。Agent 交接前后还需要显式同步点。对象级完整性可以保证,业务内容级冲突检测则尚未提供。

权限边界:执行后端不是授权系统

backend 参数只是路由选择,不是安全凭证。后端在构造时决定最大权限,例如 JavaScript 后端可配置只读或读写;对外网关仍必须验证签名能力允许选择哪些后端。尤其 Container 后端拥有真实二进制和网络,不能因为它由统一 API 调用就误认为天然安全。

换句话说,Cloudflare Computer 提供了隔离与执行构件,但多租户产品仍需自己补齐身份认证、能力授权、网络出口策略、密钥注入、资源配额和审计。Agent 工具层的描述或模型选择也不能替代确定性的权限控制。

性能:元数据操作有亮点,大文件吞吐是硬伤

官方基准运行于 Cloudflare Containers standard-2(1 vCPU、6 GiB 内存、12 GB 磁盘),REPS=3WARMUP=1。以下数字是维护者提供的结果,并非本文独立云端复测:

场景 computerd ext4 computerd / ext4 结论
stat 1,000 文件 1,971.9 ms 2,659.3 ms 0.91× 比 ext4 快约 9%
删除 1,000 文件 827.7 ms 1,281.8 ms 0.66× 元数据路径有优势
find 目录树 1,813.6 ms 4,404.2 ms 0.72× 内存 inode 查询占优
浅克隆约 1 MB 仓库 549.1 ms 576.2 ms 0.84× 小型 Agent 仓库可接受
写入 64 MiB 230.6 ms 16.8 ms 16.93× 大文件明显更慢
读取 64 MiB 437.5 ms 25.6 ms 39.72× 不适合作为大数据盘
安装 854 个 npm 包、36,675 文件 124.7 s 63.9 s 约 1.95× 完整依赖安装成本较高

慢点来自每个 512 KiB 块都要计算哈希、写入内容寻址存储并维护同步元数据。项目更像"Agent 的耐久小工作目录",而不是高吞吐通用磁盘;README 也明确建议避开完整大型 monorepo、模型权重、视频和重型归档解压。

源码成熟度与实测

审计的 main 提交为 76d9e75c。浅克隆统计到 541 个跟踪文件 ,其中 377 个 .ts 文件;按文件名识别出 148 个测试文件 。仓库包含 dofsrpccomputerdcomputer 四个主要包和 8 个可运行示例,不是只放 README 的概念项目。

本文在干净克隆上执行:

bash 复制代码
npm ci
npm run build --workspace @cloudflare/computer
npm test --workspace @cloudflare/computer

构建与测试均以退出码 0 完成。主 Vitest 套件 897 项,加上 proxy 5 项、worker backend 4 项、script runner 23 项、stub soak 4 项,共 933 项测试通过 。需要注意两点:本地 Node SQLite 仍输出 experimental warning;npm ci 的依赖审计报告 2 个 moderate、6 个 high 风险项,这只是工作区依赖扫描结果,并不等同于已确认的产品可利用漏洞,但生产试点前应进一步区分开发依赖与运行时依赖并完成审计。

📖 README 核心内容摘要

README 的核心设计可以概括为四句话:

  1. 文件先于执行环境。 Workspace 即使没有 backend 也能独立工作,持久目录不是容器附属品。
  2. 一个入口,多种执行语义。 runtime.exec()source 在容器和 Worker Shell 中是命令,在 Worker JavaScript 中是 ES Module;调用方必须清楚后端切换也会切换语言语义。
  3. 为 Agent 提供现成能力。 AI SDK 工具、Git、R2 只读挂载、Assets 与 Artifacts 让文件从生成到发布形成闭环。
  4. 生命周期必须显式管理。 长会话需要释放 stub,容器同步失败需要应用侧 alarm 承接重试。

README 还给出了清晰的规模限制:每个 Workspace 与 DO 共享约 10 GB,容器侧文件系统位于内存,不应承载超大目录;重 I/O 会被 FUSE、哈希和同步放大。文档目录虽然详细,却被官方标记为 forward-looking,阅读时必须区分当前代码和目标设计。

当前已实现与规划项尤其容易混淆:

能力 审计结论
SQLite VFS、三执行后端、统一 runtime、Git、AI SDK tools 当前源码存在并有测试覆盖
R2 只读 mount provider 当前源码存在
文档中泛化的 GitHub/Artifacts/custom mount 设计文档标注"not yet implemented",不能按完整挂载体系宣传
内容定义分块 FastCDC 仅规划;当前固定 512 KiB
vfs_changes tombstone 自动清理 文档明确尚未接线,删除密集工作负载可能让表持续增长
多写者冲突检测/合并 未实现,当前为 last-write-wins

🚀 快速上手指南

1. 安装

bash 复制代码
npm install @cloudflare/computer

截至本次核验,npm latest 指向 0.1.1。预览期 API 仍可能破坏性变化,严肃试验应在 package.json 中锁定精确版本,而不是长期漂移跟随 latest

2. 先创建一个不带执行后端的持久文件系统

ts 复制代码
import { DurableObject } from "cloudflare:workers";
import { getWorkspace, withWorkspace } from "@cloudflare/computer";

export class Agent extends withWorkspace(
  class extends DurableObject<Env> {},
  (self) => ({ storage: self.ctx.storage }),
) {}

export default {
  async fetch(_request: Request, env: Env): Promise<Response> {
    const id = env.Agent.idFromName("user-123");
    using ws = await getWorkspace(env.Agent.get(id));

    await ws.fs.writeFile("/notes.md", "- [ ] ship it\n");
    const notes = await ws.fs.readFile("/notes.md", "utf8");
    return new Response(notes);
  },
} satisfies ExportedHandler<Env>;

wrangler.jsonc 至少需要 Node 兼容标志、Durable Object binding 和 SQLite migration:

jsonc 复制代码
{
  "compatibility_flags": ["nodejs_compat"],
  "durable_objects": {
    "bindings": [{ "name": "Agent", "class_name": "Agent" }]
  },
  "migrations": [
    { "tag": "v1", "new_sqlite_classes": ["Agent"] }
  ]
}

3. 增加不依赖容器的 Worker Shell

ts 复制代码
import { WorkerShellBackend } from "@cloudflare/computer/backends/worker-shell";

export class Agent extends withWorkspace(
  class extends DurableObject<Env> {},
  (self) => ({
    storage: self.ctx.storage,
    backends: [
      new WorkerShellBackend({
        loader: self.env.LOADER,
        workspace: {
          binding: "Agent",
          id: self.ctx.id.toString(),
        },
        ctx: self.ctx,
      }),
    ],
  }),
) {}

同时补充 Worker Loader 和实验标志:

jsonc 复制代码
{
  "compatibility_flags": ["nodejs_compat", "experimental"],
  "worker_loaders": [{ "binding": "LOADER" }]
}

此后,同一份文件可直接被命令读取:

ts 复制代码
await ws.fs.writeFile("/hello.txt", "world");
using run = await ws.runtime.exec("cat /hello.txt");
const { stdout, exitCode } = await run.result();

4. 试点时的四条底线

  • 先用 Worker Shell 做文本和 Git 任务,只有需要原生二进制时才启用 Container;
  • 每个 Workspace 保持一个活动写者,或按 Agent 划分互不重叠的目录;
  • node_modules.nexttargetdist 等派生目录设置完整 ignore,避免同步数万小文件;自定义 ignore 会替换默认值,而不是追加;
  • 对外暴露 runtime.exec() 前,必须在应用层限制可选 backend、网络、密钥和资源,不要把 backend 名称当授权。

📊 增长速度与社区热度

增长速度评估

项目从 2026-06-05 创建到 2026-08-06 快照约 61.6 天 ,累计 3,913 Stars,生命周期平均约 63.6 Stars/天。这是一个用于观察早期传播强度的粗基线,不是"今日增星":新项目受发布事件和品牌流量影响很大,生命周期均值不能代表稳定增长率。

Fork / Star 比约 4.7%。对一个仅两个月、且官方不接收未经邀请 PR 的预览项目而言,184 Forks 仍显示出较强的实验意愿;但贡献入口被主动限制为 Issue 与 Discussion,不能用 PR 数低直接推断社区不活跃。

社区结构

指标 数据 解读
Stars 3,913 两个月内达到 3.9K,早期关注度高
Forks 184 Fork / Star 约 4.7%
开放 Issue 约 20 API 返回 24 个开放事项,扣除 4 个开放 PR
开放 PR 4 官方仅接受获邀协作者 PR,外部协作模式较封闭
可见贡献者 6 API 返回的贡献者中,aron-cf 为 568 次贡献,核心维护高度集中
Tags 17 v0.0.0-alpha.0v0.1.1,迭代密集
GitHub Releases 0 有 Tag 和 npm 包,但未使用 GitHub Releases 页面发布说明
测试实测 933 项通过 核心包不是概念 Demo,但平台端到端生产可靠性仍需独立验证

前六名贡献者记录合计 590 次贡献,其中第一贡献者占约 96.3%。这意味着项目推进速度快、架构一致性强,但 bus factor 偏低;再结合 API 尚不稳定,外部团队采用时应锁版本并准备迁移成本。

排名 仓库 排名 仓库
1 cloudflare/computer 8 obra/superpowers
2 huangruiteng/loopx 9 roboflow/supervision
3 TencentCloud/TencentDB-Agent-Memory 10 vercel/next.js
4 donnemartin/system-design-primer 11 tailwindlabs/tailwindcss
5 firecrawl/pdf-inspector 12 uber/ADR
6 esengine/DeepSeek-Reasonix 13 lyogavin/airllm
7 addyosmani/agent-skills --- ---

榜单里还有成熟框架、Agent Skills 集合、记忆平台和 PDF 工具。本文选择 Cloudflare Computer,不只是因为它排名第一,而是因为它把"Agent 有工具"推进到了"Agent 有可持久、可执行、可迁移的工作空间",同时包含 VFS、内容寻址同步、FUSE、RPC 和多运行时路由等更具系统深度的问题。

🎯 适用场景

场景 适配度 原因与建议
云端代码 Agent 的个人工作目录 计划、代码、中间产物可跨 DO 重启保留;保持单写者
文档、报告、图片等产物生成 Worker Shell 做轻处理,容器运行 pandoc 等工具,再经 Assets/Artifacts 输出
短生命周期自动化任务 可按成本与能力选择三种后端,不必所有任务都启动容器
带 Git 的小型仓库修改 中高 Git 可直接操作 VFS;大型 monorepo 与完整依赖安装需要评估性能
多 Agent 分工协作 每个 Agent 使用独立子目录或显式交接可行;共享文件并发写存在覆盖风险
多租户在线代码执行平台 中低 还需自行构建身份、能力授权、网络与资源隔离;官方也未声明生产就绪
大数据集、模型权重、视频处理 大文件顺序 I/O 明显慢,容器侧文件树还占内存
高频共享状态或数据库替代品 没有事务化的跨 Agent 文件协作、冲突检测或 CRDT

⚠️ 采用前必须看清的边界

  1. 预览版不是一句免责声明。 API、Wire shape 和包版本都可能变化,DO 与 computerd 没有协议版本协商,需要匹配版本锁步部署。
  2. 容器镜像不是持久真相。 当前 computerd 使用进程生命周期数据库;容器重启后依赖 DO 重新基线同步。
  3. 删除日志可能持续增长。 vfs_changes 的自动清理仍是规划项,删除密集型长期 Workspace 要监控 SQLite 体积。
  4. 忽略目录在 DO 侧完全不可见。 ignored 文件仍存在于容器并可被命令使用,但 workspace.fsreaddirstatreadFile 看不到它们。
  5. 目录 rename 的同步成本是 O(子树)。 本地 inode move 很便宜,但 wire 没有 rename opcode,需要为新旧路径生成状态与 tombstone。
  6. 公共贡献并非自由 PR 模式。 官方要求外部先提交 Issue 或 Discussion,未经邀请的 PR 可能被关闭。

💡 总结

Cloudflare Computer 最值得关注的,不是"Agent 可以执行 Shell",而是它把文件的持久性从临时沙箱中抽离出来:SQLite VFS 保存权威状态,内容寻址分块负责增量同步,容器、Worker Shell 和 JavaScript 隔离环境变成按任务选择的计算层。这套分层让 Agent 工作空间更容易跨重启保留、按用户隔离并连接产物发布链路。

它也没有魔法消除系统代价:容器同步牺牲了大文件吞吐,多写者仍是 last-write-wins,权限治理需要应用自己完成,部分设计文档仍领先于实现。现阶段最合适的定位是值得做技术验证的 Agent Workspace 基础组件,而不是开箱即用的生产沙箱。若你的 Agent 主要处理小型代码仓库、文档和可恢复中间产物,它值得进入 PoC;若核心负载是大文件、多人并发写或强隔离执行,则应等待架构继续成熟。

相关推荐
橙序员小站1 小时前
我把公众号生产链做成了全本地的 AI 工作台 🛠️
程序员·github
笨鸟先飞,勤能补拙2 小时前
AI 安全的下一个 5 年:从 Agent 到 AGI 的攻防博弈
人工智能·python·安全·web安全·网络安全·github·agi
Bryce学亮3 小时前
FileLine,基于 Qt 6 + QML 构建的跨平台文件传输与即时通讯工具
数据库·c++·人工智能·python·qt·github
董员外6 小时前
RAG 系统进化论(九):RAG 评测,怎样证明系统真的变好了?
人工智能·设计模式·程序员
VIP_CQCRE6 小时前
用 GitHub 做开发者营销:把 Ace Data Cloud 的 API 能力变成可运行项目
ai·github·api·开发者工具·acedatacloud
凌云拓界6 小时前
NodeVerdict:Node.js 原生诊断数据可视化工具
信息可视化·架构·typescript·开源·node.js·github·bug
西安小哥7 小时前
AI时代技术工程师的"道法术器势":学习图谱、成长规划与角色重塑
人工智能·设计模式·程序员
数智化管理手记7 小时前
本地云数据存储算力总是不够用?云计算如何协助架构升级?
架构·云计算·github
苏灿烤鱼7 小时前
今日 GitHub 热门|Agent 云端电脑登顶,+1,891 项目却只排第三(08.06)
github·agent·资讯