
Lyngvi 发布加固沙箱,隔离运行自主编码代理
来源标题:Lyngvi – A Hardened Sandbox for AI
Lyngvi 是一个与代理无关的加固沙箱,可让自主编码代理在自有代码仓库上运行,且不接触凭证、git 历史或互联网。它提供桌面应用和命令行两种使用方式,同一任务对应一个容器,变更文件会被归入三个类别。容器内没有任何直接对外网络路由。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
Lyngvi 是一个加固的、与具体 agent 无关的沙箱,用于在你自己的代码仓库上运行自主编码 agent。你可以从桌面应用驱动它——对话、diff 和交付都在一个窗口里——也可以从命令行驱动,那是同一个产品,只是没有窗口。agent 会拿到一份工作副本、一套工具链,以及一条受控的出口。它永远拿不到你的凭据、你的 git 历史,也没有通往互联网的路由。
查看应用
容器对外直接网络路由:0 条 每个对话一个容器 每个变更文件归入 3 个分类桶之一
Lyngvi —— Agentic 编码 GUI 应用:每个任务一个对话,agent 的工作实时呈现,输入框上方的条栏显示有哪些内容等待交付——三个文件,其中一个被扣下。
应用能做的一切也都是命令。CLI 随应用一起分发,也有独立的软件包,两者调用同一个核心:
./setup.sh --sandbox ~/sandboxes/shop init --repo ~/src/shop ✔ 沙箱已创建 · 配置档 "default" · 1 个仓库 ./setup.sh build && ./setup.sh up ✔ localhost/lyngvi-base:2.0.0 ✔ proxy 与 gateway 已在 10.89.3.0/24 上启动(内部网络)。 ./setup.sh session new --title "Fix the login redirect" --preset dev ✔ 会话 7f3a2c · 容器 lyngvi-shop-7f3a2c · 8g / 4.0 cpu echo "Find and fix the login redirect bug" | ./setup.sh session ask 7f3a2c … 读取 src/auth.ts,运行测试套件 ✗ 已拒绝 api.telemetry.example → 不在允许列表中 3 个文件有变更,测试通过。 ./setup.sh session review 7f3a2c apply src/auth.ts +12 −3 apply tests/auth.spec.ts +58 −0 hold bin/run.sh EXECUTABLE reject ../secrets.env PATH_TRAVERSAL ./setup.sh session apply 7f3a2c --branch agent/fix-login ✔ 2 个文件已提交到 agent/fix-login
名字取自北欧神话中巨狼 Fenrir 被束缚的那座岛:一个让强大力量被限制在明确边界内的场所。
创建沙箱、与 agent 对话、阅读 diff、交付你批准的内容,全都在应用里完成,完全不需要终端。下面每一屏都是真实的 JavaFX 应用,运行在一个含有一个仓库、三个对话和一个待审查变更的沙箱上。没有效果图,没有修图。
每条回复都会显示 agent 读了什么、搜索了什么、运行了什么、编辑了什么——每次编辑都带 +/− 计数——以及这一轮消耗了多少 token 和多少美元。输入框上方的条栏显示有哪些内容等待交付,其中一个文件被扣下。
Lyngvi 2.0.0 · 深色主题 · 沙箱 «shop»
Lyngvi 中的其他一切,都是围绕这四项能力的外壳。正是它们让 agent 能在你关心的仓库里无人值守地运行。
无直接网络访问 会话容器位于一个没有默认路由的内部网络上。所有出站连接都经过带允许列表的 Squid 代理,且会先评估一份已知数据外泄端点的显式阻止列表。
无法访问你的 .git agent 在一份带有全新 .git 的副本中工作——没有 hooks、没有 config、没有 remotes、没有凭据助手。整个 git 攻击面是被结构性移除的,而非靠策略限制。
密钥存放在 gateway sidecar 中 内部系统通过一个持有 token 的、只读且经过允许列表控制的 API 访问。agent 只能看到一个主机名。插件无法读取密钥:运行时会把密钥注入一个锁定的上游对象。
经过验证、由人批准后才交付 变更以补丁形式返回,在宿主机上逐文件分类,由你审查,再提交到一个工作分支。绝不提交到 main,绝不悄悄进行。
所有逻辑都在一个 Java 核心里,CLI 和 JavaFX GUI 都以进程内方式调用它。这个核心是唯一与 git 和 Podman 通信的组件。选择图中的某一部分,看看它保证了什么。
cap_drop ALL、no-new-privileges、使用你 UID 的非特权用户,内存、CPU 和 PID 限制,除工作副本、输出文件夹、附件和 AGENTS.md 之外不挂载任何东西。
agent 获得真实的开发环境——git、工具链、通过代理访问的包注册中心——但对世界的视野被严格限定。
挂载进容器的内容,此外宿主机上的任何东西都不挂载:
在结构上无法触及,而非仅仅不被鼓励:
你的 .git——hooks、config、remotes、凭据助手 你文件系统上的其他任何东西;没有 home 目录,没有 SSH 密钥 宿主机本身或其 localhost 上的服务 内部系统的 token——那些由 gateway 持有 sudo、新权限或任何 Linux capability 默认路由:未知主机在代理处就失败,而不是在你的防火墙上失败
Agent 可互换 Claude Code 和 OpenCode 作为参考适配器随附,支持订阅登录或 token。适配器就是一个 agent.json 加一份命令契约,所以接入第三个 agent 只是写一个配置文件,而不是 fork。运行在你自己机器上的模型(Ollama、LM Studio、MLX)通过代理在你配置档指定的端口上访问。
先评估阻止列表,再评估允许列表;两者都不匹配的一律拒绝。试一个主机名,看看代理会怎么回答。
已允许——在允许列表中 registry.npmjs.org 配置档 由你组织分发的配置档所允许。
一次交付以某个基线为起点衡量——会话开始、上次交付,或两者之间的任意一次交付——在容器内构建成补丁,然后在宿主机上分类。分类由你决定,而不是 agent。
选择 diff 的起点:会话开始、上次交付,或更早的一次交付。
使用一次性的索引构建,因此未提交、未暂存和 agent 已提交的工作都会一并包含。
宿主机上按规则分为三个桶:apply、hold、reject。
逐文件处理,可按 hunk 或整文件,在 GUI 或 CLI 中均可。
在工作分支上提交或暂存。受保护分支会被拒绝。
src/auth.ts 已修改 +12 −3 apply src/session/cookie.ts 已修改 +4 −1 apply tests/auth.spec.ts 已新增 +58 −0 apply bin/run.sh EXECUTABLE 已新增 mode 100755 hold docs/screenshot.png BINARY 已新增 二进制 hold ../secrets.env PATH_TRAVERSAL 已新增 +1 −0 reject ./setup.sh session apply --branch agent/fix-login 3 个文件将提交到 agent/fix-login。
(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。