Zerostack – A Unix-inspired coding agent written in pure Rust
565 points • 2 days agoArticle Link

zerostack 是用 Rust 编写的极简编码代理,追求低内存占用和高性能。它支持多种 AI 提供商(包括 OpenRouter 、 OpenAI 、 Anthropic 、 Gemini 、 Ollama 及自定义提供商),提供文件操作、受权限控制的 bash 执行、会话管理和支持 Markdown 渲染的终端 UI 。代码量约 7,000 行,空会话内存占用约 8MB,工作时约 12MB,二进制体积约 8.9MB 。

权限系统有四个等级,从严格到宽松,可为各工具配置模式并设定会话白名单;内置 doom-loop 检测可防止重复调用相同工具。代理配备了提示(prompts)系统,内置模式包括 code 、 plan 、 review 、 debug 、 ask 、 brainstorm 、 frontend-design 、 review-security 和 simplify,运行时可切换,且可通过 Markdown 文件添加自定义提示;代理还会自动从项目目录加载 AGENTS.md 或 CLAUDE.md 。

zerostack 包含面向长周期任务的实验性循环功能,能让代理按计划迭代执行直至完成;并集成了 git worktrees,支持"每任务一分支"的工作流,可在聊天 UI 中创建、切换、合并和退出 worktree 。该工具支持 MCP 服务器以扩展工具能力,并集成了 Exa 搜索用于网络抓取与检索。安装依赖 Cargo 和 git,且可选通过 bubblewrap 开启沙盒模式以隔离命令执行。

307 comments • Comments Link

• 用 Rust 构建定制代理在安全性和性能上有明显优势,但在启用自变异工具而不引入任意代码执行的情况下仍存在挑战,这促使有人尝试嵌入 Deno 或为工具执行定义二进制 API 。

• Rust 的编译特性限制了运行时脚本能力,因此建议使用 Rhai——一种轻量、可嵌入的脚本语言——作为安全且对 LLM 友好的定制方案,无需引入重量级运行时。

• Zerostack 利用 Rust 的高效性、栈分配数据结构(smallvec 、 compactstring)、 LTO 优化和单线程异步运行时,实现了极低的内存占用(约 8–12MB),而不是靠限制上下文窗口大小来降内存。

• 上下文窗口大小并不直接决定本地 RAM 使用,因为模型及其 KV 缓存通常驻留在服务器端;本地内存更多由应用逻辑消耗,而非 token 的存储。

• Panic 处理方式(abort 与 unwind)需要权衡:abort 能减小二进制体积并避免复杂的展开状态,但牺牲了可调试性;unwind 提供堆栈跟踪,但会让二进制体积增加约 50KB 。

• 像 Zerostack 和 nanoin(少于 200 行)这样的轻量级代理表明,有效的编码代理可以非常小、启动快且占用内存低,与占用数 GB 的臃肿工具形成鲜明对比。

• 代理设计理念各有不同:有人倾向于集成功能(如 git worktrees 和 Ralph Wiggum 循环)以改善用户体验,而另一些人则主张将编排与执行层分离。

• 技能与提示模板能提供可扩展性,但 Zerostack 选择更简洁的提示库机制,通过 .md 文件替换整个系统提示,降低复杂度同时保持灵活性。

• 对开源、独立于公司的极简编码代理的需求在增长;本地运行、对 Ollama 的支持、权限模式和高效资源使用等成为关键差异化要素。

• JetBrains 被认为在构建深度集成的 IDE 代理方面具有独特优势,能够访问丰富的代码索引,但尽管用户兴趣明显,行动仍显迟缓。

讨论反映出社区对轻量、透明且可由用户控制的编码代理有强烈需求,Rust 被视为优先的性能与安全选择。内存效率、最小依赖和避免被公司掌控是反复出现的关注点,尤其是在用户对主流工具臃肿与不透明性的不满下。关于设计权衡——例如嵌入式脚本 vs. 编译、 panic 处理方式与功能集成——以务实的角度展开讨论,通常基于旧硬件或安全等现实约束。虽然并无统一的架构共识,但普遍认为代理框架应赋予用户控制权而非将他们抽象化,简单性、可审计性和本地执行对于信任与可用性至关重要。