cloudflare/workspace

GitHub: cloudflare/workspace

Cloudflare Workspace 为 AI Agent 提供基于 Durable Object 的虚拟文件系统与可插拔 shell 执行环境,支持容器级 Linux 沙箱和 Worker 级轻量命令两种模式。

Stars: 45 | Forks: 4

# Cloudflare Workspace Cloudflare Workspace 是一个存在于 Durable Object 内部的虚拟文件系统。Durable Object 在 SQLite 中保存权威状态,并通过可插拔的 backend 将文件系统暴露给 shell。目前内置两种 backend: - **Container** 将 SQLite 状态作为 真实的 FUSE 挂载映射到 sandbox container 中。sandbox 端的 daemon (`wsd`) 将状态挂载为 文件系统,并通过 capnweb RPC 通道将更改同步回去。 完整的 Linux 用户空间、真实的二进制文件、真实的网络。 - **Worker** 将 shell 作为 [just-bash](https://github.com/vercel-labs/just-bash) 运行在通过 `env.LOADER` 加载的 Dynamic Worker 内部。Shell 通过 Workers RPC 访问宿主工作区,因此没有第二个 存储,也没有同步往返。广泛的文本工具(`cat`、 `grep`、`awk`、`sed`、`jq`、...),没有 container 生命周期。 单个 Workspace 可以同时托管多个 backend。每个 backend 在一个稳定的 `id` 下注册;`shell.exec` 默认使用列表中的第一个,调用者可以使用 `{ backend: "sandbox" }` 将特定的调用路由到其他地方。常见结构:使用 Worker backend 处理轻量级的文本工具(每次 命令都是冷启动),再加上一个 Container backend,当 agent 需要 真实的 Linux 环境来运行 `npm`、`git` 或 worker isolate 无法 托管的任何其他内容时即可调用。每个 backend 都保留自己的 同步游标,并在首次使用时延迟连接。 Workspace 也可以在没有 backend 的情况下构建,让 调用者独立使用文件系统。 ## 要求 - Node 22 或更高版本。 - npm。此 repo 使用 npm workspaces。 - 如果你想端到端运行 `packages/wsd`,需要带有 FUSE 的 Linux。其他 软件包也可以在 macOS 上构建和测试。 - 可选的 Docker,用于 [`examples/container`](examples/container)。 Worker 示例不需要 Docker。 ## 快速开始 ``` git clone https://github.com/cloudflare/workspace.git cd workspace npm install npm run build:all npm test ``` 要查看各个部分如何协同工作,请从示例开始: - [`examples/container`](examples/container) — 在 container 内运行 `wsd`,挂载工作区,并通过 capnweb 与 Durable Object 通信。 - [`examples/worker`](examples/worker) — 与 container 示例具有相同的 HTTP 接口,但 shell 运行在 通过 `env.LOADER` 加载的 Dynamic Worker 中。不需要 container。 - [`examples/think`](examples/think) — 一个将 workspace 作为其工作目录的 agent。 ## 仓库布局 该 repo 是一个小型的 monorepo。每个软件包都有自己的 README,其中包含 特定于软件包的状态和使用说明。 - [`packages/dofs`](packages/dofs/README.md) (`@cloudflare/dofs`) — 基于 Durable Object SQLite 的虚拟文件系统、同步协议 构建块,以及用于 Node 的 `@platformatic/vfs` 提供程序。 - [`packages/rpc`](packages/rpc/README.md) (`@cloudflare/workspace-rpc`) — 在 Durable Object 和 `wsd` 之间共享的 capnweb 线路类型和 服务器/客户端助手。 - [`packages/wsd`](packages/wsd/README.md) (`@cloudflare/workspace-wsd`) — `wsd` daemon:一个 FUSE 挂载加上 在 sandbox container 内运行的 HTTP/WebSocket RPC 服务器。 - [`packages/workspace`](packages/workspace/README.md) (`@cloudflare/workspace`) — 由 Durable Object 使用的顶级 Workspace 软件包。开发中。 ## 性能 数据来自 `script/fs-bench.sh` 以及对 [`cloudflare/sandbox-sdk`](https://github.com/cloudflare/sandbox-sdk) (854 个软件包,36,675 个文件)的完整 `npm install`,在 Cloudflare Containers **standard-2** 实例(1 vCPU、6 GiB 内存、12 GB 磁盘)上运行 [`examples/wsd-container`](examples/wsd-container)。 wsd FUSE 挂载位于 `/workspace`;比较列分别是 位于 `/tmp` 的内存级 `tmpfs` 和位于 `/var/tmp` 的 container ext4 根磁盘。 比率是 `wsd / baseline` —— 数值越低速度越快,低于 1.0 的值意味着 wsd 优于 baseline。 ### `fs-bench` (REPS=3, WARMUP=1, 随机目标) | 场景 | wsd | tmpfs | tmpfs 比率 | ext4 磁盘 | 磁盘比率 | |---|---:|---:|---:|---:|---:| | **微小文件频繁操作** | | | | | | | 创建 1000 个文件 | 560.6 ms | 83.2 ms | 6.7x | 303.2 ms | 1.85x | | stat 1000 个文件 | 1971.9 ms | 1324.2 ms | 1.49x | 2659.3 ms | **0.91x** | | 删除 1000 个文件 | 827.7 ms | 322.7 ms | 2.56x | 1281.8 ms | **0.66x** | | **目录遍历** | | | | | | | mkdir 树 (10×10×10) | 1597.5 ms | 1585.7 ms | 1.01x | 3034.7 ms | **0.74x** | | find 树 | 1813.6 ms | 1819.9 ms | 1.00x | 4404.2 ms | **0.72x** | | **大文件 I/O** | | | | | | | 写入 64 MiB | 230.6 ms | 47.3 ms | 4.87x | 16.8 ms | 16.93x | | 复制 64 MiB | 1037.2 ms | 37.4 ms | 27.75x | 39.8 ms | 40.46x | | 读取 64 MiB | 437.5 ms | 22.6 ms | 19.33x | 25.6 ms | 39.72x | | 纯读取 64 MiB | 263.1 ms | 8.3 ms | 31.54x | 8.5 ms | 30.26x | | 纯复制 64 MiB | 852.9 ms | 21.7 ms | 39.27x | 22.0 ms | 41.47x | | 覆盖 64 MiB | 272.6 ms | 8.3 ms | 32.91x | 8.5 ms | 43.35x | | **git** | | | | | | | git init + commit 100 个文件 | 459.2 ms | 40.3 ms | 9.56x | 635.4 ms | **0.72x** | | git clone (shallow, ~1MB) | 549.1 ms | 421.0 ms | 1.30x | 576.2 ms | **0.84x** | | **npm** | | | | | | | npm init + 微量安装 | 598.5 ms | 630.7 ms | **0.95x** | 630.7 ms | **0.95x** | ### 完整的 `cloudflare/sandbox-sdk` `npm install` | 目标 | 时长 | |---|---:| | tmpfs (`/tmp`) | 34.3 s | | wsd FUSE (`/workspace`) | 124.7 s | | ext4 磁盘 (`/var/tmp`) | 63.9 s | 对于完整的 `npm install`,wsd 比 container 的 ext4 磁盘慢约 2 倍,比 tmpfs 慢约 3.6 倍。对于一般使用而言,磁盘比较 是更现实的 baseline。 ### wsd 快于磁盘 baseline 的情况 在元数据繁重的工作中,内存中的 inode 存储击败了真实磁盘: `stat`、`rm`、`mkdir tree`、`find tree`、`git init`、`git clone`、 `npm init`。这八个场景涵盖了工具(如 `git status`、模块解析和增量构建)的大部分日常开销。 ### wsd 较慢的情况 大文件顺序 I/O。wsd 写入路径会在每次发布时将每个 [`CHUNK_SIZE`](packages/dofs/src/fs/writeFile.ts) (512 KiB) 数据块 哈希到内容寻址的 blob 存储中;这就是 Durable Object 能够仅同步已更改的数据块并 对相同内容进行去重的原因。开销体现在原始的 `dd` 风格的吞吐量数据上,但很少影响真实的开发者 工作负载,这也是为什么尽管 `pure read 64 MiB` 慢了 30 倍,`npm init + tiny install` 仍能与磁盘 baseline 持平的原因。 ### 复现 ``` bash script/run-fs-bench.sh ``` 或者针对已部署的 `wsd-container` 实例,上传 [`script/fs-bench.sh`](script/fs-bench.sh) 并使用 `MOUNT=/workspace BASE=/tmp` 运行它。 ## 文档 - [`docs/`](docs/README.md) — 设计规范。具有前瞻性; 请视为意图。 ## 贡献 有关设置、格式化、 测试、提交信息和拉取请求规范,请参阅 [`CONTRIBUTING.md`](CONTRIBUTING.md)。 如果你作为 agent 在此 repo 中工作,请从 [`AGENTS.md`](AGENTS.md) 以及 [`.agents/skills/`](.agents/skills/) 下的技能开始。
标签:AI智能体, Durable Objects, MITM代理, SOC Prime, 后端开发, 开发工具, 沙箱容器, 程序员工具, 虚拟文件系统, 请求拦截