OpenChamber Isolated Spaces 设计深度解析:容器化隔离开发环境的边界、网关与代码进出机制
AI Agent人工智能代码智能体交互助手【免费下载链接】openchamberAgentic Development Environment based on OpenCode AI agent项目地址https://gitcode.com/gh_mirrors/op/openchamber点击查看免费下载本文基于 docs/isolated-spaces/DESIGN.md 展开结合 packages/web/server/lib/spaces/DOCUMENTATION.md、STAGES.md、TESTING.md 及 stage-0 四份实验记录系统讲解 OpenChamber 的 Isolated Spaces隔离空间功能它如何在容器副本中运行 AI Agent、如何用 Gatekeeper 把守唯一出口、如何通过exec通道搬运代码以及这套设计背后限制必须是 Agent 无法撤销的边界这一核心原则。读完你将掌握该特性的整体架构、九个产品决策要点、Place 契约八种操作、网关的走廊/窗口/控制三层机制与代码进出Code in/out的完整实现路径。什么是隔离空间隔离空间是 OpenChamber 的一项核心安全特性用户让 Agent 在一个容器内、对项目的一份副本工作。任务完成后用户把结果应用到自己的代码库或者丢弃它。它的动机全部在范围内保护用户机器Agent 无法直接接触宿主让 Agent 无需权限弹窗即可运行因为它在不可信的副本里让宿主密钥与 Agent 隔离让项目工具链不落在宿主上。与 OpenCode 上游实验性的 Workspaces 路由/同步层不同隔离空间是一条独立路线Workspaces 只覆盖 OpenCode 的 API而文件、git、终端、预览都属于 OpenChamber必须自己转发见 LESSONS.md 中 OpenCode workspaces 一节该实验层对进程隔离、出口流量、凭据作用域与 apply/discard 都无能为力。边界规则承诺在这里一文不值设计文档的第一条铁律是每一条限制都是 Agent 从内部无法撤销的。承诺在这里一文不值。任何越过边界的东西都是用户逐项决定的。如果某个选择依赖 Agent自觉表现那它就是错的。宿主把来自空间的一切都当作不可信数据来展示绝不当作命令执行。这一原则贯穿全部 19 条产品决策与整个实现——例如 gatekeeper 程序把空间发来的每一条输入都视为敌意输入来防御DOCUMENTATION.md 的 The program 一节。核心词汇术语含义Space空间一个装有 Agent 和代码副本的容器可容纳多个会话类似 worktree。新空间总是新容器只有镜像与每项目的包缓存是共享的Place场所空间运行的地方本地 Docker、通过 SSH 访问的另一台机器上的 Docker、Kubernetes 集群、Applecontainer未来还有沙箱服务。用户可配置多个场所和一个默认场所Gatekeeper守门人每个空间旁边的一个独立小容器是空间唯一的出路Space manager空间管理器packages/web中的新服务端模块负责创建、查找、停止、移除空间搬运代码交付 grantDispatcher分发器现有服务器前的一层薄转发层把属于某空间请求转发到该空间内的服务器Grant授权用户给空间的一个凭据或一个放行的域名分两档用大白话向用户展示Grant 的两档Uses without seeing用而不见gatekeeper 持有密钥并把它加进请求。适用于模型 API key、https 上的 git、私有 npm。Handed over直接交出空间内一个 Agent 可读的文件或变量。如.env、SSH 密钥、云 CLI 密钥、短期的 OpenAI 登录 token、Copilot token。十九条产品决策从代码怎么进到开关怎么设计DESIGN.md 的第 32–52 行给出了完整的 19 条产品决策是理解整个特性的总纲代码以副本进入。宿主任何东西都不挂载进空间。从干净提交或用户未提交的改动出发。.gitignore匹配的文件绝不传输。网络是用户按空间选择白名单或开放互联网。两种模式下 gatekeeper 都拦截用户私网、link-local 段与云元数据地址只取名字、不取地址只放行 443 端口——这样空间永远无法从用户地址攻击第三方其他服务。Grant 可在创建时与工作期间给予不可收回随空间消失。OpenChamber 不存任何密钥值只记住宿主来源的名字环境变量、文件、ghtoken实现和上次一样一键复用。空间内 Agent默认不需要任何工具权限现有按会话开关保留grant 对话框会明确说Agent 可无确认使用该授权。两种应用方式作为带 Agent 提交的分支或作为未提交改动未提交变体若无法干净应用则什么都不碰转而提供分支方案。Apply 对话框带之后删除空间选项默认开启Discard 总是删除需确认。Apply 与 discard 之后聊天保留为只读归档直到用户删除。关闭 OpenChamber 不会停止空间OpenChamber 可以重启其中卡死的 OpenCode。空间在闲置数小时后自行停止阈值是可设置项且可关闭停止保留文件。用户永远不需要终端管理容器OpenChamber 只展示并管理自己创建的东西。模型登录发 API key 的提供商包括发 key 的 coding plan走 gatekeeperOpenAI 浏览器登录只交出短期 access token宿主保持唯一 refresherCopilot token 长期有效故警告更强Claude Pro/Max 浏览器登录因 OpenCode 已移除而不提供。预览空间内运行的 dev server 是首发功能。默认镜像优先项目自定义镜像devcontainer.json、Dockerfile是后置阶段。承载面web、桌面、移动端VS Code 永不提供此功能其入口故意缺席且必须在代码中可见。用户主动开启该功能——Settings 中一个默认关闭的开关。构建期间功能藏在同一开关后首次发布时它变成用户的选项而非被移除。功能需要容器运行时、会在用户机器上造容器并下载约1.6 GB镜像不该挡着不用它的人。关闭开关会停止所有空间但保留文件重新打开时文件仍在原位。开关旁有横幅仅在确有东西要停时才出现说明有几个空间、文件保留、会回来无法停止的空间运行时没跑或场所不可达报告为仍在运行而不是悄悄算作已停。删除空间绝不并入关开关——它是独立动作且必须经过列出会丢失内容的确认。开关关闭时功能完全不做任何事无进程、无docker或运行时命令、无连接、无运行时状态读取、无路由、无入口。第一个进程只能是用户打开开关或在该功能自身界面操作的后果。特别是启动时绝不探测运行时来决定是否显示入口——入口因开关开启而存在探测只存在于漏斗内部。用户旅程从设场所到善后DESIGN.md 的 User journey 一节给出了完整的 9 步流程0. 设场所一次性选择Agent 在哪里工作——本机、另一台 SSH 机器、集群。OpenChamber 自己检查选择并用大白话回答它会说明何时某场所无法限制网络、何时密钥会离开用户机器。设场所会在后台拉取镜像。1. 创建新会话目标选择器中New worktree 旁边就是 New isolated space。四项选择场所、起点、网络、预置 grant每个 grant 显示其档位。2. 准备项目下立刻出现带容器徽章的分组和状态行会话立即打开消息先排队、空间就绪后自动发出代码一到 Agent 就开始依赖可能仍在安装错误会指名要修的设置。3. 工作分组内会话与普通会话无异关闭 OpenChamber 后 Agent 继续工作OpenAI 浏览器登录模式约一小时后短 token 过期则等待用户打开 OpenChamber。4. Agent 缺东西分组显示 gatekeeper 日志中被拦截的尝试带 Open 动作Grant access 位于分组与会话头部授权经由宿主。5. 审查常规 git 面板和 diff空间里的 dev server 在内置浏览器打开。6. 决定以分支应用、以未提交改动应用、或丢弃。7. 之后聊天保持只读归档。8. 出问题时分组上有状态。三个从软到硬的动作重启 OpenCode、重启容器、删除不可达空间会明说应用其余部分继续工作重启后 OpenChamber 自行找回其空间。9. 总览项目菜单中worktree 旁打开项目空间Settings 的 places 页面展示每个场所上运行了什么、孤儿空间、镜像和缓存占用磁盘及清理动作不可达场所显示其空间为不可达绝不显示为空列表。总体架构组成部分DESIGN.md 给出如下架构图HOST PLACE ┌────────────────────────┐ ┌─────────────────────────────────────┐ │ OpenChamber server │ manages │ ┌────────────┐ ┌───────────┐ │ │ ┌──────────────────┐ │────────►│ │ gatekeeper │◄─────│ space │ │ │ │ space manager │ │ │ │ keys, │ only │ agent, │ │ │ ├──────────────────┤ │ forwards│ │ allowlist │ exit │ code copy │ │ │ │ dispatcher │ │◄───────►│ └─────┬──────┘ └───────────┘ │ │ └──────────────────┘ │ │ ▼ internet │ └────────────────────────┘ └─────────────────────────────────────┘空间运行与宿主相同的组合一个 OpenChamber 服务器加一个 OpenCode。宿主只与空间内的 OpenChamber 服务器对话。只有三个狭窄的触点直接接触 OpenCode且都集中在一个小模块里这样 OpenCode 格式变化只需改一个文件指向 gatekeeper 的 provider 配置、短期 OpenAI token 的登录记录、把聊天搬到宿主做归档。空间以非 root 用户运行具备只读根文件系统、全部 capability 丢弃、无特权提升、引擎 seccomp profile、进程数限制、无额外 swap 的内存限制、封顶日志、无容器运行时 socket、无 bind mount。顺序是create、verify、start场所先重读真实容器状态任何不符就拒绝启动。开关与检查的归属清单见 packages/web/server/lib/spaces/DOCUMENTATION.md。宿主资源也是边界的一部分没有内存限制和日志上限Agent 就能耗尽宿主内存或通过自己的输出填满磁盘。每个场所在其设置里有默认空间尺寸不逐个询问用户命名 Docker 卷默认驱动无尺寸上限——这是已记录的已知限制。内部 Docker 网络本身仍会让空间通过网桥网关触及监听 Docker 宿主所有接口的服务在原生 Linux 上那个宿主就是用户机器。因此 Docker 场所用gateway_mode_ipv4isolated创建网络并关闭 IPv6把宿主的地址从网桥移除引擎忽略该选项则验证失败。这要求Docker Engine 28 或更新。一个常驻的逃逸测试会在宿主上启动监听器并证明空间无法连接每个后来的场所都必须通过同一测试。Place 契约八个操作场所契约只有八个操作DESIGN.md 第 95–104 行其他一切都在它们之上编写一次操作含义check此场所是否可用真正能做什么create内网、gatekeeper、空间全部打标签list按标签找到我们的空间exec在空间或 gatekeeper 内运行命令exec argv为自行启动进程的调用方如 git 经ext::推代码提供在空间内跑命令的 argv发出前与exec一样被检查connect给宿主一条通到空间内服务器的通道stop、start、remove生命周期操作verify对照请求的加固要求重新检查已创建容器exec是控制通道代码传输、grant 投递、token 刷新、修复全都走它。空间自身的网络看不见它。能力是探测出来的不是声明的——场所通过一次真实的出网尝试来证明它确实限制了网络。实现上各场所从服务器调用系统 CLIdocker、带 SSH 目标的docker、每次都显式传 context 与 namespace 的kubectl、以及container。SSH 变体用系统ssh及用户自己的密钥与配置要求密钥认证且不碰 Electron SSH 管理器。实现细节见 places/docker.js、places/registry.js遵循packages/web/server/lib/tunnels/的隧道提供者注册表模式。运行时的标签是空间唯一的事实来源宿主不为它们维护状态文件宿主只存场所设置、密钥来源名与归档聊天。用户仓库refs/openchamber/下的服务 ref 被允许——因为起始快照必须躲过 git 的垃圾回收才能继续作为结果补丁的基线。版本与工具卷空间如何零下载启动基础镜像是公开镜像、按 digest 固定、独立于 OpenChamber 发布。需要 glibc 上的 Node两个终端库都发布预编译 glibc 二进制stage 0 用node:22-bookworm。它必须是多架构索引 digestdocker manifest inspect验证见 DOCUMENTATION.md Base image。场所用一个可信一次性容器填充 tools 卷该容器能访问 npm registry然后只读挂载进空间。卷内容 宿主 OpenChamber 服务器版本 匹配的 OpenCode OpenCode 的插件包所以空间启动零下载。服务器拒绝在没有 OpenCode 相伴时启动。已填充的卷永不改变新内容 新卷运行中的空间保留它启动时的程序。实测stage 1b一次填充约36 秒、磁盘 438 MB从 create 到健康服务器2.3 秒每个空闲空间约370 MiB 内存大部分是 OpenCode。OpenCode 需要项目工具通过.opencode/tool导入插件包其工具列表会等待插件后台安装无网络时那次等待实测 131 秒。把插件链接到项目目录上方可消除该等待——create会在/spaces/id/node_modules/opencode/plugin建一个指向 tools 卷中插件的符号链接。空间必须带 init 进程并以openchamber serve --foreground运行否则容器无法干净停止。无新发布产物宿主更新后停止的空间在下次 start 时迁到新 tools——场所用新卷重做容器空间文件留在自己的卷里。运行中的空间绝不被触碰。开发构建不能复用 registry 安装同名本地包与已发布的不同改为安装本地web与sdk的打包 tarball并用 npm override 让本地 sdk 全局胜出。判定宿主是否为开发构建属于尚未构建的接线。代码进出Code in / Code outgit 走控制通道git 经控制通道与 git 对话无网络、无端口、无归档、无共享文件夹DESIGN.md 第 130–142 行。宿主始终是驱动方精确命令序列、时序与恶意容器结果在 stage-0/e4-git-over-exec.md。空间内空间路径下一个普通非裸仓库。宿主只推refs/openchamber/*base、start-index、start永不推refs/heads/*。进先发当前快照、后台再发历史。push 无法加深浅接收端所以历史先进空间内的一个侧边裸仓库再本地 unshallow。未提交改动以两个快照提交传输从索引副本构造、用用户正常 git 配置工作树、索引与全局 ignore 文件都被尊重且不被改动在空间内展开为已暂存/未暂存改动。作者名与邮箱会传输签名密钥留在宿主。未忽略的未跟踪文件会传输创建对话框在确认前列出随未提交改动传输的文件。出快照空间内一切。先抓入一个一次性 quarantine 仓库——宿主自己强制大小上限与超时git 两者都没有。再带对象检查提升结果到refs/openchamber/spaces/id/result无标签、无子模块递归、空 refmap。被杀死的 fetch 在临时仓库留下部分 pack空间内遗留进程需要自己的清理。宿主从抓取的两个树构建补丁空间从不提供补丁文本。应用 普通 dry run 后跟普通 apply两者都支持二进制。三路模式在带未暂存编辑的工作树上会失败。被应用的就是宿主抓取到的不管空间屏幕上显示了什么。首次发布限制创建时各有警告子模块保持为空Git LFS 文件以指针到达。现在实现于 code-in.js六个函数takeSnapshot、listTravellingFiles、readTransferLimits、bringCodeIn、sendHistory、removeSpaceRefs宿主 git 环境过滤规则集中在 host-git.js剥离GIT_DIR、GIT_INDEX_FILE、GIT_NAMESPACE等重定向变量与GIT_TRACE家族注入GIT_OPTIONAL_LOCKS0与空core.hooksPath保证用户的钩子/fsmonitor/自动 gc 一概不运行同时保留用户的全局 ignore 与 Docker 环境。恶意容器结果已实测越界 refspec、标签、hasDotgit树、..路径、.gitmodulesext url、60 MB 大 blob、假 upload-pack 挂起——全部有对应防御显式 refspec --refmap、--no-tags、fetch.fsckObjectstrue、quarantine 大小上限、进程组超时。关键结论git apply是全有或全无冲突时 dry run 与真实 apply 都失败且宿主状态逐字节不变。实测93 MB、3687 提交的仓库完整历史快照 push 3.76 秒、纯快照 0.98 秒30 MB先快照后历史在 Docker over SSH 与 Kubernetes 上尤其划算。E2E 实测stage 3a代码进 1.1 秒、历史 0.6 秒本仓库克隆3711 提交、约 5200 文件2.0 秒进、103 MiB 历史 9.9 秒。Gatekeeper空间唯一的出路空间位于一条内网其唯一其他成员就是 gatekeeper。Docker 上 gatekeeper 不跑 DNS 服务器stage 2 在 Engine 29.2.1 实测内嵌 DNS 能解析 gatekeeper 的网络别名公共名仍不解析需要别名解析的场所如 Applecontainer的 host-only 网络则由 gatekeeper 为空间解析。三个监听器DOCUMENTATION.md The gatekeeper 的拓扑图inner network (internal, no gateway) outer network (ordinary bridge) space ──────────► gatekeeper ──────────► the internet corridor 3128 window 8080 control 127.0.0.1:9099Corridor走廊CONNECT 隧道通向允许域名的 CONNECT 隧道gatekeeper 只看到目的地。两种模式宿主实时切换、无需重启allowlist名字精确匹配无通配、无后缀匹配列表上的名字用与目标相同的谓词检查宿主不可能放入走廊恒拒的名字与open任何名字过名字检查。两种模式都只放行 443能到任意端口的空间就能从用户地址攻击第三方端口扫描、SSH 爆破、邮件滥用数据总能经 443 离开但攻击一个不在 443 监听的服务的路径被真正关闭。需要其他端口时正确途径是 grant 对话框里显式address:port。auth.openai.com两种模式下都拒绝白名单说了也不算窗口也拒绝它作为 upstream。诚实的表述是三层保证的是用户的长期 refresh token 永不进入空间白名单模式下该域名不可达开放模式下只是更难而非防住——空间可达任意 443 公共主机可经第三方中介走廊只见中介名字。实测stage 2仅拒名字不是锁——空间能按地址到达同一主机所以走廊取名字两种模式都拒绝地址目标。两种模式下拒绝都按解析后的地址走廊自己解析名字任一答案是 loopback、私网、link-local、CGN、组播、保留或云元数据地址即拒含::ffff:0:0/96、NAT6464:ff9b::/96、6to42002::/16。名字指末标签既非数字也非十六进制的域名——这关闭了1746020849、0x01010101、1.1.257、0x1.0x1.0x1.0x1、0177.0.0.1等拼写实测有人用其中一个拼写穿过纯地址检查。连接去往被检查的那个地址名字绝不解析第二次这就是防 DNS rebinding 的一行代码。拒绝原因只进日志、绝不告诉空间区分deny:blocked-address与deny:unresolved会让 Agent 遍历域名映射出用户内网 DNS。连接数也封顶走廊 128、窗口 64、控制通道 8都是程序参数拒绝客户端会被放行drain 而非立即 close避免 RST 丢掉刚送达的 403 文本隧道 300 秒无字节即关闭隧道建立后按 TCP 语义逐边关闭destroySoon保证大下载字节级完整——旧实现实测 4 MB 传输丢 1.1–1.6 MB新实现四次全量 sha256 相等。Window窗口反向代理注入密钥服务需要密钥时的反向代理模式空间内工具与 gatekeeper 对话gatekeeper 加密钥并经 TLS 转发。OpenCode 的 provider base URL、git 的 URL 重写、npm 的 registry 设置都指向它。空间内不安证书、不拦截 TLS。/model/grant id/rest去往该 grant 的 upstream按 provider 设头部OpenAI 风格用Authorization: Bearer keyAnthropic 用x-api-key: key空间发的authorization/x-api-key/proxy-authorization先被移除。OpenCode 侧用options.baseURL dummyoptions.apiKey且无存储 auth 条目内建 auth 插件即让路stage 0 用假 key 与假模型服务器验证完整可运行的opencode.json在 stage-0/e3-model-window-and-short-token.md。路径穿越防护..逐轮解码直到一轮解码回自身每轮按/、\、;、?、#切分后比较固定轮数是有洞的四重编码实测穿过三轮。拒绝一切带%的 rest 又太宽scoped npm 包scope%2fname正是该窗口的一半用途。窗口对 grant upstream 故意不套私网规则——用户自己的私有 registry 正是设计想要的唯一拒绝是 gatekeeper 自身地址。由此宿主必须守住一条规则永远不要用空间说过的东西构造 grant。实测upstream 300 秒无字节即 504 failed:timeout记录slot 归还64 个挂起请求全部恢复。控制通道与日志控制通道是 gatekeeper 自身 loopback 上的 HTTP 监听空间不可达只接受宿主的四种请求GET /health、POST /network{mode, domains}实时替换、POST /grants{id, upstream, header, secret}、GET /journal。实现为单一自包含 CommonJS 脚本 gatekeeper-program.cjs经exec的 stdin 写入 tmpfs密钥只在程序内存里永不在容器设置、标签、env 或磁盘上。机器重启后空间显示 needs access用户一键重新授权。日志journal内存 500 条环形缓冲每条 时间、监听器、目标主机与端口、决策永不记录路径、query、body、头部值或密钥。UI 用它看拦截尝试与Agent 去过哪里。决策词包括allow、failed:code、deny:not-a-name、deny:not-on-allowlist、deny:port、deny:blocked-address、deny:too-many-tunnels、deny:malformed等DOCUMENTATION.md Journal 完整列出。空间内环境变量stage 2 实测定稿变量作用HTTPS_PROXY、https_proxy、HTTP_PROXY、http_proxy四个都http://gatekeeper:3128走廊。curl 7.88.1 故意忽略大写HTTP_PROXYhttpoxy 防护小写拼写不是可选项NO_PROXY、no_proxygatekeeper,localhost,127.0.0.1窗口流量与空间自身 loopback 跳过走廊。curl 与 Node 都会把 loopback 送去代理不在 NO_PROXY 里则空间内宿主健康检查会进走廊NODE_USE_ENV_PROXY1Node 22 没有它完全忽略代理变量实测EAI_AGAINOPENCODE_DISABLE_MODELS_FETCH1、OPENCODE_DISABLE_AUTOUPDATE1关掉模型目录与更新检查的走廊尝试OPENCHAMBER_RELAY_HOSToff空间永不被动托管 relay忽略代理的工具如 ssh因无路由而失败——这正是边界规则想要的。npm_config_fetch_retries0已移除走廊对未允许请求立即 403而 npm 不重试 403实测npm view无路由 70 秒走廊立即 403 时 0.3 秒Agent 自己的npm install拿回重试。空间里绝不设OPENCODE_AUTH_CONTENT——它优先于文件直到重启。短期 OpenAI token记录是oauth条目真实短期access、dummyrefresh、真实expires。管理器经exec用PUT /auth/openai推新 token下一次请求生效过期时用户看到干净的一次性 Token refresh failed无重试循环。保护用户登录的是长期 refresh token 永不进入空间两种网络模式下都成立。实测 stage 2拒绝名字本身不是锁可按地址达同一主机所以走廊取名字并在两种模式拒绝地址目标。若空间首次 OpenAI 记录到达时项目实例已加载需POST /instance/dispose后再推。opencode run --attach在 provider 错误时退出码为 0——从 session 事件读失败绝不读退出码。带 OpenAI 浏览器登录的空间必须让provider.openai.options.baseURL保持未设两者是否冲突未验证。Dispatcher、会话与事件空间代码位于每空间唯一、两侧相同的路径如/spaces/id/repoUI 把它当又一个项目目录。客户端寻址dispatcher 从不猜测请求只在路径以/api/spaces/id/开头且 id 在管理器标签派生列表内时才进空间。dispatcher 认证用户、剥离前缀与用户凭据cookies、bearer、URL token、加上空间自己的 token、其余原样流式转发。它不读任何目录、body、session id 或 terminal idstage 0 拒绝了服务端识别方案——终端 socket 多路复用所有终端、dev tunnel 只具名端口、约十条路由族只在 body 或 session id 里携带目录详见 stage-0/e2-dispatcher-recognition.md 的完整清点。UI 侧一个纯函数在调用时把目录变成前缀应用于 SDK fetch wrapper、runtimeFetch和 socket/asset URL 助手什么都不缓存。两个服务端守卫只拒绝前缀请求的目录越出该空间根返回 400无前缀但目录落在/spaces/下的请求在路径门和 last-directory 回退之前得到稳定 4xx。会话键控动作从 session 记录取目录无服务器确认目录就失败空间存在后 current-directory 回退消失。仅宿主、永不加前缀provider 与 auth 页面、设置、GitHub、Linear、voice、guests、项目路由。跨边界拒绝移动会话、worktree 与 git-integrate 动作、/api/fs/serve、/api/preview/proxy。来自空间的/api/fs/raw仅以nosniff和安全内容类型转发。新 socket 与 asset 路径必须加入 relay、URL-token 认证与 Electron realtime proxy 的精确匹配白名单否则移动端静默失败。管理器每次宿主启动都经exec签发新空间 tokenstage 1b 起 create 时写入空间 HOME 下文件服务器启动时读取Agent 能读该 token所以它防别人、永不防 Agent。空间响应不能设置 cookie空间文件绝不渲染为应用 origin 下的页面。会话列表 宿主列表 每个可达空间列表每空间一个完整性标记不可达空间保留上次已知会话并标记 stale缺失答案绝不等于删除。合并把空间列表与事件视为不可信丢掉目录越出该空间根的记录绝不覆盖宿主 session id。实测stage 1bOpenCode 1.18.31为/spaces/id/repo创建的会话精确报告该目录经符号链接到达的目录以真实路径返回。所以宿主只给 OpenCode 真实路径。每个空间有自己事件连接与状态v2 事件翻译层之后附加、指数退避间隙后客户端重读该一个空间。活动点、未读标记、通知对空间会话生效因为它们喂同一 watcher。闲置计时器在空间内部所以 OpenChamber 关闭时它仍工作。Skills 加载与质量门槛设计文档要求按变更区域加载对应技能openchamber-change-discipline恒加载信任边界类变更加固、网络与 gatekeeper 策略、exec 与生命周期、grant 与凭据、代码进出与 apply、dispatcher 隔离、预览内容、防护测试加载isolated-space-boundarydispatcher/会话/事件加载ui-api-decoupling、relay-transport、sync-state-invariants每个子进程加载desktop-shellUI 加载theme-system、locale-ui-patterns、settings-ui-patterns所有面向用户文本走每语言的 locale 系统。TESTING.md 定义了五层测试无运行时逻辑单测、对每个场所实现的固定契约套件、真实 Docker 全路径、从空间内部以攻击者身份运行的逃逸测试目标是Agent 不能绝不是它能以及各平台手工清单。逃逸测试覆盖绕过 gatekeeper 直连互联网按 IP 与名字、不经 gatekeeper 解析 DNS、访问白名单外域名、访问宿主服务/本网/link-local/云元数据地址含 DNS rebinding 与 IPv6-mapped 形式、在 env/文件/进程列表/容器元数据中找到模型密钥、找到被忽略.env中的 bait 密钥、触及运行时 socket 或提权、写只读文件系统越界路径、改/换/重挂 tools 卷、在容器元数据中找到空间内服务器 token、从空间网络达空间内服务器、达 gatekeeper 控制通道或另一空间的 gatekeeper、给自己签发 grant、让宿主经 apply 运行东西git hooks、标签、quarantine 外 refs、让空间文件在应用 origin 下渲染为页面或设 cookie、在任何转发请求里看到用户 OpenChamber 凭据、在会话列表/事件中声称越界目录或宿主 session id、无限挂起结果 fetch 或填满宿主磁盘、让.git/hooks/x、.GIT、..、a/../../x等树路径穿过对象检查或在 apply 时经符号链接写入、在空间任何位置找到用户长期凭据两种网络模式下都成立。运行逃逸测试的命令DOCUMENTATION.md Testsbun run --cwd packages/web test -- server/lib/spaces OPENCHAMBER_TEST_DOCKER1 bun run --cwd packages/web test -- server/lib/spaces OPENCHAMBER_TEST_DOCKER_PACKED1 bun run --cwd packages/web test -- server/lib/spaces/places/packed第二行还会对本地 Docker 守护进程跑 live 文件contract/escape/server/code-in第三行跑 packed live 测试需编译 sdk 并打包本地 web 与 sdk。注意真实集群不可触碰——每个测试显式具名自己的 context 与 namespace拒绝针对任何其他目标运行。分期交付与后续STAGES.md 把特性拆成小 PR 分期交付stage 0 四个实验2026-09-19 完成均带修改通过stage 1a Docker 场所与空间管理器1b tools 卷与空间内服务器2 gatekeeper3a 代码进2026-09-22 完成 3b 代码出与 apply自带隔离审查4 dispatcher/会话/事件5 UI 旅程6 dev server 预览7 浏览器登录首次发布本地 DockerSettings 中默认关闭的 opt-in8 Docker over SSH9 集群10 Apple container。每阶段完成 真实运行时上 works afterwards 为真且检查有证据清单行只有passed, with evidence或blocked, with the reason两种状态。对首个把真实凭据放到窗口后面的阶段有一项强制义务Linux 上任何本地进程都能达走廊与窗口Linux Docker 宿主路由进网桥子网、无需发布端口、窗口不认证——Debian 13/Engine 29.8.1 实测macOS/Windows 有虚拟机挡着。两个候选方案宿主随 grant 给窗口一个每次请求携带的密钥或窗口只绑定空间内网地址都必须与首个真实凭据同 PR 关闭。DESIGN.md 的 Later 列出后续方向项目自定义镜像、子模块、沙箱服务不同信任模型因为代码与 grant 交给第三方、Copilot 经 gatekeeper、把新的宿主变更带进运行中的空间。关于本设计的验证边界必须诚实说明未验证项DESIGN.md 与各阶段文档明确记录stage 0 未验证经窗口走 TLS 的真实模型调用、真实 OpenAI token、docker exec以外的传输与 Windows 宿主stage 2 未验证任何 Docker 以外的场所与真实 provider/真实 Agent turnstage 3a 未验证部分克隆、sparse checkout、超过 1 GB 的仓库与慢链路宿主 git 2.27.0 下限来自 git 手册页而非实测空间内存约 370 MiB 是空闲值、gatekeeper 约 24 MiB 是空闲值。这些数字是选定值而非真实工作负载下的测量阅读与引用时请以仓库内记录为准。上游OpenCode、Docker、Apple container移动很快设计文档也提醒在据其构建前重新核查事实。赞分享AI Agent人工智能代码智能体交互助手【免费下载链接】openchamberAgentic Development Environment based on OpenCode AI agent项目地址https://gitcode.com/gh_mirrors/op/openchamber点击查看免费下载相关推荐Windmill 流水线环境隔离Fork 数据环境与 DuckLake 物化隔离机制深度解析Windmill 流水线环境隔离Fork 数据环境与 DuckLake 物化隔离机制深度解析 导读 本篇文章围绕 Windmill 开源仓库中 docs/pi后端工作流自动化任务调度低代码前端Czkawka终极磁盘清理工具快速释放空间的专业解决方案Czkawka终极磁盘清理工具快速释放空间的专业解决方案 你是否经常发现电脑硬盘空间不知不觉就满了重复的照片、无用的临时文件、相似的音乐和视频这些数字垃桌面应用**深度探索isolated-vm为Node.js打造的多隔离环境**深度探索isolated vm为Node.js打造的多隔离环境 项目介绍 isolated vm 是一款专为Node.js设计的强大工具库旨在为你提供对V8开发工具安全上一篇一份脚本搞定 osv-scanner 离线漏洞库定时同步下一篇Haven自定义CSS与字体教程打造独一无二的博客外观创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考