4.3 KiB
Agent Note: 共享 E2B 远程运行时 POC
Status: implemented
English | 中文
问题
远程 coding agent(智能体)后端只有在文件操作与命令观察到同一个一致环境时才有用。若在各工具上分别接入 E2B,Bash 命令和文件系统编辑可能访问不同的沙箱;若把完整 harness 迁入远程 VM,则会把提供方实验与 agent、会话、模型、持久化及部署变更耦合在一起。
决策
E2B 集成是一个提供方组合 POC,由一个共享生命周期所有者和两个功能实现组成:
@deepseek-ai/dsh-e2b创建或重新连接一个安全的 E2B 沙箱,创建其工作目录与私有运行时目录,并拥有 kill/pause/leave 资源释放操作。@deepseek-ai/dsh-fs-e2b在该沙箱的 Filesystem API 之上实现ctx.fs。@deepseek-ai/dsh-subprocess-e2b在 E2B Commands 和远程 Linux 进程组之上实现ctx.subprocess。- 现有的
@deepseek-ai/dsh-bash-local继续作为 Bash 实现,因为它把所有进程机制委托给ctx.subprocess。
该所有者是沙箱身份的唯一真源。提供方会注入该所有者,绝不创建私有沙箱。因此,该组合让文件系统工具与 Bash 共享一个远程 cwd、进程命名空间和 spill/状态目录,同时保留现有功能接口与面向模型的工具。
POC 边界
只有文件系统状态、提供方存续期内的命令进程,以及适配器拥有的远程文件会迁入 E2B。宿主仍保留 Cordis 和插件对象、agent loop(智能体循环)、agent/会话状态、会话日志及其持久化、模型请求、skill(技能)、subagent 编排和 E2B SDK 缓冲。该 overlay 不会上传或挂载宿主工作区;拼写相同的 cwd 字符串分别指向彼此独立的宿主与远程目录。受管进程组仍会在进程管理服务 dispose(资源释放)时终止并等待退出,包括保留沙箱采用 pause 或 leave 处置方式之前。
本 POC 没有 PTY 适配器、LSP 专用集成、会话持久化后端、代码运行时后端、模板构建器、卷、快照、网络策略层、沙箱目录或工作区同步。保留沙箱后重新连接只能证明生命周期连续性;它不会重建宿主进程句柄、输出游标或锁。
验证
包测试固定生命周期清理、文件系统 seam 语义、进程管理的进程组/stdio/中止行为,以及包自有不变式注册。凭据门控的真实 Loader 组合会创建一个沙箱,证明同一远程 cwd 中 FS-write→Bash-read 和 Bash-write→FS-read 双向可见,证明两个文件均未出现在宿主 cwd 中,释放组合,并确认该沙箱 id 已不存在。
曾考虑的替代方案
每项功能或每个工具使用独立的 E2B 沙箱。 不予采纳,因为文件操作和命令操作将无法共享身份或状态,既违背 coding agent 用例,也会增加生命周期所有者的数量。
在 E2B 内运行完整 harness 进程。 不予采纳,因为这会同时改变部署、凭据流、模型传输、会话持久性、插件加载和监管方式。要证明提供方 seam,并不需要同时回答这些彼此独立的问题。
同时添加 E2B 专用 Bash、PTY、LSP、持久化和同步包。 不予采纳,因为 Bash 已经具备所需的进程管理 seam,其他功能则需要各自的消费方证据和生命周期设计。缺少它们是显式保真边界,而不是尚未公开的不完整计划。
仅通过 shell 命令实现文件系统操作。 不予采纳,因为这会绕过文件工具已经使用的 ctx.fs 身份、结构化错误、版本防护、流式读取和原子变更语义。
后果
这个小型组合证明,现有功能 seam 可以把 agent 的可变 coding 环境移出宿主,而无需改变循环或面向模型的工具包。sandboxId 与 pause/leave 允许实验手动保留状态,演示仍以 kill 作为清理策略。
该提供方并不能对所有消费方与本地进程管理后端互换:远程启动无法同步公开 PID,E2B 会在 SDK 内存中保留完整命令输出,回调输出并非字节保真,信号归因依靠推断,重新连接也无法恢复句柄。保留沙箱后会累积远程进程/spill 产物。这些缺口作为 POC 约束明确记录,而不会引入兼容垫片或新的跨领域抽象。