沙箱后端
源码版本v2026.7.20
职责
agent 要执行命令、跑代码,但不能让任意命令直接打到宿主机。Hermes 的终端工具支持 6 种执行后端,按安全/隔离/成本权衡选择:Local(本机直跑)、Docker(容器隔离)、SSH(远端机器)、Singularity(HPC 容器)、Modal(云沙箱,direct 或 managed)、Daytona(云开发环境)。容器硬化 + 命名空间隔离,危险命令还经审批回调拦截。
关键文件
terminal_tool 头部文档:1-15— 列出 local / docker / modal / ssh / singularity / daytona 六后端Docker host 访问检测:260-290—_docker_volume_uses_host_path/_docker_has_host_access(检测 bind mount 是否暴露宿主路径)Singularity / Modal 导入:65-90—_get_scratch_dir(来自 environments/singularity)environments/singularity.py— Singularity scratch 目录与 SIF 缓存Modal 模式解析:77-137—coerce_modal_mode/has_direct_modal_credentials/resolve_modal_backend_state(direct vs managed)_DEFAULT_BROWSER_PROVIDER:12— 默认 provider 为 local子代理审批回调:75-103—_subagent_auto_deny/_subagent_auto_approve(沙箱内执行的危险命令管控)tools/daemon_pool.py— 子代理常驻线程池(承载沙箱执行)tools/ 目录— terminal / close_terminal / read_terminal / tool_backend_helpers / environments/
数据流
- agent 决定执行命令 → tool_call
terminal→tools/terminal_tool.py。 - 按作业配置选后端(local/docker/modal/ssh/singularity/daytona):
local:直接宿主执行(最快,默认)docker:tools/terminal_tool.py:260检测 bind mount 是否暴露宿主路径,据此决定权限modal:经tools/tool_backend_helpers.py:102解析 direct(用户自己的 Modal 凭据)还是 managed(网关托管)singularity:经tools/environments/singularity.py准备 scratch 与 SIFssh/daytona:远端/云环境
- 危险命令经审批回调拦截——主循环用交互式审批;子代理默认 auto-deny(
tools/delegate_tool.py:75),cron/批量可 opt-in auto-approve。 - 命令输出回填主循环;长任务可后台化(
tools/daemon_pool.py)。
小结
沙箱层是「执行隔离 + 危险命令管控」:6 后端覆盖从本机到 HPC 到云;Docker 检测 bind mount 防越权;Modal 区分 direct/managed 凭据;危险命令统一走审批回调。子代理与 cron 走 auto-deny/auto-approve 的非交互路径。