Skip to main content
Runtime Capsule 是在 harness setup 之前注入的通用、不可变工具链 Closure。它提供稳定的 Node/npm、Python/pip 等运行时,但不包含也不识别具体 harness。Harness 版本仍由已有的 install_commandopenhands_version 指定。 AgentCompass 当前注册 node24-v1(用于 Claude Code、Codex)、python312-v1(用于 OpenHands)和 python312-node24-v1(用于需要在单个 Capsule 中提供 Python 3.12、Node 24 和 uv 的安装流程)。

执行流程

Capsule 不替代 preinstalledinstall_if_missingupload。Codex 和 Claude Code 的 preinstalled 路径跳过 Capsule;install_if_missing 找到已有 harness 时也不下载或安装 Capsule。未设置 setup_capsule_tag 时,继续使用原安装方式。

Bundle 契约

v1 bundle 是根目录包含 agentcompass-capsule.json 的 gzip tar;分发文件名与摘要由内置 registry 定义:
Manifest 不含 harness id、harness version 或 harness entrypoint。新构建产物的 Node/Python ABI 与 platform.libc 一致。一个 bundle 可以携带 glibc 和 musl 私有库,支持独立启动不同 ABI 的 ELF;这不能让 glibc 进程加载 musl 原生扩展,或反过来。 AgentCompass 校验摘要、平台、归档路径和所需工具,然后原子安装到 /tmp/agentcompass-capsules/。Harness 包安装到只由 Capsule 内容决定的 /tmp/agentcompass-capsule-setups/<bundle-sha256>/ 可写目录,Capsule 本身保持不可变。

激活与兼容机制

Capsule 不使用 bubblewrap、chroot、替代 rootfs、mount namespace 或命令桥接。Benchmark 镜像始终是 /,因此 harness 看到的文件系统、设备、网络、cwd 和进程能力与原生启动一致。 Capsule launcher 只在 setup 时把工具链加入 PATH。最终 harness 通过绝对路径启动,不导出 Capsule PATH、npm prefix 或全局 LD_LIBRARY_PATH,所以 shell/tool 子进程解析的是 benchmark 镜像中的命令和依赖。OpenHands 在导入 harness 模块后还会移除 setup 专用的 PYTHONPATH 项。 安装完成后,seal-tree 只检查 AgentCompass 自有的 setup root。它把 Node/Python/bash shebang 指向私有运行时。对于声明 interpreter 的 ELF 可执行文件,仅当已有 loader 无法装载时,才写入匹配的私有 loader 和 RPATH;对于共享库和原生扩展,则在 RPATH 中追加匹配的私有库路径。当前每个 bundle 同时携带私有 glibc 与 musl ABI 支撑,因为同一个 npm 包也可能混用两类 ELF。该过程不修改目标系统库或全局 linker 配置。 Python 的公共入口使用 wrapper 执行实际解释器,让 uv/venv 正确记录解释器所在目录和标准库位置。安装阶段仍可能执行刚下载的原生程序,运行期也可能懒安装新依赖;这些文件不会被之后或之前的一次 seal-tree 自动覆盖,必须在对应安装流程中验证。 此机制解决运行时缺失或用户态依赖过旧,不能模拟 CPU 指令、内核 syscall、seccomp 权限、可执行挂载或其他架构;这些情况会直接失败,不回退到 repair_glibc Node 24 自带的 npm 会限制未批准依赖的生命周期脚本。Claude Code 和 Codex setup 会为用户明确配置的 harness 安装启用传统脚本行为,因此 install_command 应只指向可信包。

构建 Capsule

构建器支持 Docker 和 Podman,通过 --container-cli docker--container-cli podman 选择,默认使用 Docker;原有 --docker 参数保留为兼容别名。为每种目标 libc profile 构建一个不可变产物:
默认固定 Node.js 24.19.0(npm 11.17.0)和 Python 3.12.10(含 pip)。可用 --node-version 24.x.y--python-version 3.12.x 选择其他精确版本。当前构建器产出 Linux x86_64 bundle。 复合 Capsule 还提供固定版本的 uv/uvx,默认 uv 0.12.10,可通过 --uv-version 调整。它把 Python、Node 和安装工具放在同一个 bundle 中,适合需要两套工具链的安装流程。它不包含 Chromium 或任意工具插件的全部依赖。 本功能尚处未合入的开发阶段,迭代产物沿用现有 v1 标签和分发文件名,覆盖旧产物时同步更新 registry 的 SHA-256。控制端若缓存了旧产物,也须替换对应缓存文件;摘要校验仍保持严格。

在 harness 中使用

Codex:
Claude Code 使用相同的 setup_capsule_tag。切换 harness 版本只修改 install_command,不修改 Capsule tag。 OpenHands 使用 Python Capsule:
此时 OpenHands 使用 Capsule pip 安装 SDK/tools,不再下载 micromamba。 Capsule 提供工具链而非 harness 包,install_if_missing 仍需要 Environment 能访问 package registry。离线环境应提供 registry cache、可离线的 install_commandpreinstalledupload Hermes 的裸 AIAgent 与完整 CLI 的配置、工具初始化和会话行为不等价。评估其安装覆盖时,应安装官方 CLI 依赖并使用官方执行入口;即使省去 TUI,本地浏览器工具仍可能需要 Node/npx、Chromium 和系统库。Python loop 可以启动,不代表完整工具集可用。

分发与缓存

AgentCompass 为每个逻辑 tag 及其所有目标变体内置分发文件名、SHA-256 和下载地址。用户只选择逻辑 tag,不接受任意本地路径、URL 或 OCI reference。 Bundle 保存在控制端 <data_dir>/capsules/<filename>。文件存在时,AgentCompass 只校验 SHA-256,不访问网络也不改写文件;文件不存在时,先下载到同目录临时文件,校验预定义摘要后原子重命名。 新增社区 Capsule 需要提交 AgentCompass registry 变更。发布物还应提供签名、SBOM、构建 provenance 和依赖许可证。

repair_glibc 的关系

配置 setup Capsule 后,Claude Code、Codex 和 OpenHands 都不会调用 repair_glibc,Capsule 失败时也不静默回退。Legacy repair 只保留在现有非 Capsule 路径中。 每个 Environment 使用一个满足该安装流程依赖的 Capsule。复合工具链作为单个产物构建,不在目标环境中组合多个 Capsule。