从零编写 Sandcastle 沙箱提供商:Bind-Mount 与 Isolated 双模式完整指南

发布时间:2026/9/2 13:45:49

从零编写 Sandcastle 沙箱提供商:Bind-Mount 与 Isolated 双模式完整指南
从零编写 Sandcastle 沙箱提供商Bind-Mount 与 Isolated 双模式完整指南【免费下载链接】sandcastleOrchestrate sandboxed coding agents in TypeScript with sandcastle.run()项目地址: https://gitcode.com/gh_mirrors/sandcastl/sandcastle️Sandcastle是一个用 TypeScript 编排 AI 编码智能体的开源库你只调用一次sandcastle.run()它就把智能体关进隔离沙箱干活、再把分支上的提交合并回来。内置了 Docker、Podman、Vercel 三种沙箱提供商但真正的亮点是——你可以编写自定义沙箱提供商。本文将带你从零开始用两种方式接入任意隔离环境Bind-Mount绑定挂载与Isolated完全隔离从接口契约到跑通第一次运行全程只讲核心步骤。为什么需要自定义沙箱提供商当你想在自己的环境里跑智能体时会遇到这些场景️ 公司内网有自研的容器运行时或轻量虚拟机☁️ 想接 E2B、Daytona 这类云端沙箱服务 写测试时不想依赖 Docker想用一个纯本地临时目录模拟沙箱Sandcastle 的架构把怎么执行命令抽象成了SandboxProvider接口定义在 src/SandboxProvider.ts你只要实现一个小巧的 Promise 接口Sandcastle 会替你处理 worktree 创建、git 挂载解析、提交提取这些脏活。先选模式Bind-Mount 与 Isolated 的 3 秒判断法两种模式的本质区别只有一句话沙箱能不能直接访问宿主机的文件系统对比项 Bind-Mount绑定挂载 Isolated完全隔离适用场景Docker、Podman 等本地容器运行时云端 VM、微虚拟机等独立文件系统环境代码同步宿主机建好 worktree 后直接挂载进沙箱零同步由你实现copyIn/copyFileOut手动搬文件分支策略支持head、merge-to-head、branch三种仅支持merge-to-head、branch无法写宿主机默认分支策略head智能体直写宿主机工作目录merge-to-head临时分支 合并回 HEAD工厂函数createBindMountSandboxProvider()createIsolatedSandboxProvider()一句话决策本地容器 → Bind-Mount远端 VM / 云端沙箱 → Isolated。更多模式的选型背景可以参考仓库里的调研文档 research/sandbox-provider-research.md。核心契约沙箱 Handle 只需要 3~4 个方法两种提供商的create()函数都返回一个沙箱句柄handle契约非常小方法Bind-MountIsolated作用exec(command, opts)✅ 必须✅ 必须在沙箱中执行命令必须支持逐行流式输出close()✅ 必须✅ 必须销毁沙箱worktreePath✅ 必须✅ 必须仓库目录在沙箱内的绝对路径copyFileIn/copyFileOut✅ 必须— / ✅ 必须单文件在宿主机与沙箱间拷贝copyIn—✅ 必须拷贝文件或整个目录进沙箱两个关键细节官方在 src/SandboxProvider.ts 的注释里写得非常明确exec必须支持onLine逐行流式回调——这是 Sandcastle 给用户实时反馈、执行空闲超时的唯一通道。等进程结束再一次性吐出全部输出的实现不满足契约空闲超时和实时日志都会失效。每次exec返回统一的ExecResult{ stdout, stderr, exitCode }。第一步5 分钟写出你的 Bind-Mount 提供商以把本地进程当沙箱为例适合快速理解契约也适合写测试完整代码见 src/sandboxes/test-bind-mount.tsimport { createBindMountSandboxProvider } from ai-hero/sandcastle; const localProcess () createBindMountSandboxProvider({ name: local-process, create: async (options) { const worktreePath options.worktreePath; return { worktreePath, // 逐行流式执行命令spawn readline每行回调一次 onLine exec: (command, opts) { /* spawn(sh, [-c, command]) … */ }, copyFileIn: async (hostPath, sandboxPath) { /* 拷入单文件 */ }, copyFileOut: async (sandboxPath, hostPath) { /* 拷出单文件 */ }, close: async () { /* 本地进程无需清理 */ }, }; }, });create收到的BindMountCreateOptions包含worktreePath宿主机 worktree 路径、hostRepoPath、mounts宿主:沙箱路径对和env——写容器提供商时把这些映射成你的-v挂载参数即可。真实实现可参考 src/sandboxes/docker.ts含 SELinux 标签支持和 src/sandboxes/podman.ts。第二步5 分钟写出你的 Isolated 提供商Isolated 提供商多了两件事目录级拷贝和独立文件系统的清理。最小示例临时目录模拟远端 VM见 src/sandboxes/test-isolated.tsimport { createIsolatedSandboxProvider } from ai-hero/sandcastle; const tempDir () createIsolatedSandboxProvider({ name: temp-dir, create: async () { const root await mkdtemp(join(tmpdir(), sandbox-)); const worktreePath join(root, workspace); await mkdir(worktreePath, { recursive: true }); return { worktreePath, exec: (command, opts) { /* 同上的流式执行实现 */ }, // 目录递归拷入文件单拷 copyIn: async (hostPath, sandboxPath) { const isDir (await stat(hostPath)).isDirectory(); isDir ? await cp(hostPath, sandboxPath, { recursive: true }) : await copyFile(hostPath, sandboxPath); }, copyFileOut: async (sandboxPath, hostPath) { await mkdir(dirname(hostPath), { recursive: true }); await copyFile(sandboxPath, hostPath); }, close: async () { await rm(root, { recursive: true, force: true }); }, }; }, });接真实云服务时把copyIn换成 SDK 的上传接口即可例如 src/sandboxes/vercel.tsVercel Firecracker 微虚拟机和 src/sandboxes/daytona.tsDaytona 云沙箱含输出尾部长度限制防止长日志撑爆内存。第三步接入 run()第一次运行就跑通提供商写好后通过sandbox选项传给run()——用法和内置docker()完全一样import { run, claudeCode } from ai-hero/sandcastle; const result await run({ agent: claudeCode(claude-opus-4-8), sandbox: localProcess(), // 你的自定义提供商 prompt: Fix issue #42 in this repo., }); console.log(result.commits); // [{ sha: abc123 }]⚠️别忘了分支策略的差异详见 README.md 的Custom Sandbox Providers章节Bind-Mount 提供商默认为head——智能体直接写宿主机工作目录快但无分支隔离Isolated 提供商默认merge-to-head——提交先在临时分支产生结束后自动合并回 HEAD出问题时 HEAD 毫发无损是 CI 与无人值守场景的安全默认值想指定分支比如给 PR 用时显式传branchStrategy: { type: branch, branch: agent/fix-42 }两种模式都支持。避坑清单与参考实现 写提供商时最容易踩的四个坑exec不做流式输出→ 实时日志消失、空闲超时失效最常见的坑Isolated 的copyIn只拷文件不拷目录→ worktree 整体搬不进去智能体开工即报错close()没有清理资源→ 云端沙箱泄漏账单刺客Isolated 提供商配了head分支策略→ 类型层面直接报错因为它无法写宿主机。 官方参考实现索引文件模式说明src/sandboxes/docker.tsBind-MountDocker 容器含 SELinux 标签src/sandboxes/podman.tsBind-MountPodman 容器无守护进程src/sandboxes/vercel.tsIsolatedVercel Firecracker 微虚拟机src/sandboxes/daytona.tsIsolatedDaytona 云沙箱SDK 动态导入src/sandboxes/test-bind-mount.tsBind-Mount临时目录版适合写单测src/sandboxes/test-isolated.tsIsolated临时目录版适合写单测接口类型BindMountSandboxHandle、IsolatedSandboxHandle、ExecResult等全部集中在 src/SandboxProvider.ts完整使用文档见 README.md。总结三种提供商一张表带走提供商类型工厂函数文件同步分支策略典型代表Bind-MountcreateBindMountSandboxProvider挂载共享零同步全部三种Docker / Podman / 你的本地运行时IsolatedcreateIsolatedSandboxProvidercopyIncopyFileOutmerge-to-head/branchVercel / Daytona / 你的云 VMNo-SandboxnoSandbox()无直接跑在宿主机全部三种本地交互式会话掌握契约后你会发现写一个 Sandcastle 沙箱提供商核心代码其实只有exec、文件拷贝、close三块——剩下的一切sandcastle.run()都替你编排好了。【免费下载链接】sandcastleOrchestrate sandboxed coding agents in TypeScript with sandcastle.run()项目地址: https://gitcode.com/gh_mirrors/sandcastl/sandcastle创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

电力系统功率失衡影响与调频控制技术解析

电力系统功率失衡影响与调频控制技术解析

2026/9/2 13:35:48

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

vue-vben-admin AI 模块完整指南:5 分钟给后台加上数据预测和智能表单校验

vue-vben-admin AI 模块完整指南:5 分钟给后台加上数据预测和智能表单校验

2026/9/2 13:35:48

vue-vben-admin AI 模块完整指南:5 分钟给后台加上数据预测和智能表单校验 【免费下载链接】vue-vben-admin A modern vue admin panel built with Vue3, Shadcn UI, Vite, TypeScript, and Monorepo. Its fast! 项目地址: https://gitcode.com/GitHub_Trending/v…

Lightpanda 无头浏览器完整指南:省 9 倍内存、快 11 倍的极速方案

Lightpanda 无头浏览器完整指南:省 9 倍内存、快 11 倍的极速方案

2026/9/2 13:35:48

Lightpanda 无头浏览器完整指南:省 9 倍内存、快 11 倍的极速方案 【免费下载链接】browser Lightpanda: the headless browser designed for AI and automation 项目地址: https://gitcode.com/GitHub_Trending/browser32/browser AI 代理、大规模网页抓取、…

SillyTavern 加载提速实操指南:8 处调整让大角色库打开快 3 倍

SillyTavern 加载提速实操指南:8 处调整让大角色库打开快 3 倍

2026/9/2 14:45:52

SillyTavern 加载提速实操指南:8 处调整让大角色库打开快 3 倍 【免费下载链接】SillyTavern LLM Frontend for Power Users. 项目地址: https://gitcode.com/GitHub_Trending/si/SillyTavern 凌晨两点,你正和角色聊到关键剧情,切到角…

MemPalace实战避坑清单:15个新手最容易踩的坑与官方纠正记录

MemPalace实战避坑清单:15个新手最容易踩的坑与官方纠正记录

2026/9/2 14:45:52

MemPalace实战避坑清单:15个新手最容易踩的坑与官方纠正记录 【免费下载链接】mempalace The best-benchmarked open-source AI memory system. And its free. 项目地址: https://gitcode.com/GitHub_Trending/me/mempalace MemPalace 是一个免费开源的本地 …

杰文斯悖论:视频技术效率提升为何让消耗不降反升?

杰文斯悖论:视频技术效率提升为何让消耗不降反升?

2026/9/2 14:45:52

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

Spring Boot应用Nginx代理下静态资源404/403问题排查与配置实战

Spring Boot应用Nginx代理下静态资源404/403问题排查与配置实战

2026/9/2 14:45:52

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

AI视频音频修复与智能延长:本地部署、功能测试与工程实践指南

AI视频音频修复与智能延长:本地部署、功能测试与工程实践指南

2026/9/2 14:45:52

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

vue-vben-admin 接入 qiankun 微前端:3 个关键机制决定落地成败

vue-vben-admin 接入 qiankun 微前端:3 个关键机制决定落地成败

2026/9/2 14:35:51

vue-vben-admin 接入 qiankun 微前端:3 个关键机制决定落地成败 【免费下载链接】vue-vben-admin A modern vue admin panel built with Vue3, Shadcn UI, Vite, TypeScript, and Monorepo. Its fast! 项目地址: https://gitcode.com/GitHub_Trending/vu/vue-vben…

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

2026/9/2 10:08:07

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

2026/9/2 12:11:52

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

2026/9/1 23:49:08

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

单片机毕业设计-基于单片机与蓝牙通讯的输液状态监测终端设计与开发 基于 STM32 或 51 单片机的液位‑滴速‑温度多参数输液监护装置设计(024005)

单片机毕业设计-基于单片机与蓝牙通讯的输液状态监测终端设计与开发 基于 STM32 或 51 单片机的液位‑滴速‑温度多参数输液监护装置设计(024005)

2026/9/2 0:04:59

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

DeepSeek字幕翻译实战:从API调用到批量SRT转中文的完整方案

DeepSeek字幕翻译实战:从API调用到批量SRT转中文的完整方案

2026/9/2 0:04:59

这次我们来看一个很实用的 DeepSeek 落地场景:用 DeepSeek 把英文视频字幕自动翻译成中文。具体案例是《恶魔君》1989 年第 28 集的英转中字幕任务,标题写得很直白,但背后其实是一整套可以复用的技术流程:字幕解析、模型调用、批量…

用Python搭建搞笑语音助手:从语音识别到语音合成全教程

用Python搭建搞笑语音助手:从语音识别到语音合成全教程

2026/9/2 0:04:59

当你家里摆着一台天猫精灵,却总希望语音助手偶尔“不正经”一点,不用官方腔回答问题,而是张口就接几句搞笑段子,会是什么体验?我最近动手验证了一下这个想法——没有去改装任何市面上现有的智能音箱,而是直…

远程协作的工作台整理

远程协作的工作台整理

2026/9/2 6:21:32

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/2 6:21:32

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/2 2:45:06

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…