agentty 产品分析:当 AI 编程助手跑进终端,用 C++ 重写一切

agentty 产品分析:当 AI 编程助手跑进终端,用 C++ 重写一切 agentty 当 AI 编程助手跑进终端用 C 重写一切概述AI 编程助手赛道这两年卷得厉害从 GitHub Copilot 到 Claude Code从 Cursor 到 Windsurf各种形态的产品层出不穷。但如果你是一个习惯在终端里干活的人可能会发现一个尴尬的现实这些工具要么重度依赖 Electron 和 Node.js启动慢、内存吃得多要么把用户锁定在自家 IDE 里离开那个环境就什么都不是。agentty 就是为了解决这个问题而生的——一个用 C26 写的、编译成单个静态二进制文件的终端 AI 编程助手冷启动不到 1 毫秒不依赖 Node、Python 或任何运行时支持几乎所有主流大模型。它做的事情和 Claude Code 类似但走了一条完全不同的技术路线。产品背景要理解 agentty 为什么存在得先看看它所处的环境。2024 到 2025 年间AI 编程助手经历了一轮爆发式增长。Anthropic 推出了 Claude Code一个基于终端的 agentic coding 工具凭借 Claude 模型强大的代码理解和工具调用能力迅速在开发者社区走红。但 Claude Code 有一个让不少人诟病的问题它是一个 Node.js 应用。这意味着每次启动都要加载整个 Node 运行时冷启动时间动辄几秒甚至更长内存占用也不低。对于习惯了vim、tmux、各种轻量级终端工具的开发者来说这种重是难以接受的。与此同时终端原生工具的优势在 AI 时代被重新审视。终端是开发者最熟悉的界面SSH 远程开发、容器内操作、服务器运维——这些场景下图形界面要么不可用要么体验很差。一个能在终端里跑、资源占用极低、启动极快的 AI 编程助手有着明确的市场需求。agentty 的作者显然看到了这个缺口。项目的 GitHub 仓库创建于 2026 年 4 月定位非常明确做 Claude Code 的替代品但用完全不同的技术栈来实现。从它的 topics 标签claude-code-alternative、static-binary、cpp26、airgap就能看出作者的核心主张——更快、更轻、更自由。更深一层看这个项目也反映了开源社区对单一供应商锁定的警惕。Claude Code 绑定 Anthropic 的 APICursor 绑定 OpenAI而 agentty 从一开始就设计成多模型、多提供商的架构把选择权交还给用户。功能分析agentty 的功能可以分成几个核心模块来看。多模型支持这是 agentty 最基础也最重要的能力。它默认使用 Claude支持 OAuth 登录可以直接用 Claude Pro/Max 的订阅但也支持通过--provider参数切换到其他模型OpenAIGPT-4o 等GroqLlama 3.3 等OpenRouter接入几乎所有模型Ollama本地模型比如 Qwen2.5-Coder任何兼容 OpenAI API 的端点而且模型切换不需要重启在应用内按CtrlP就能实时切换。这个设计让 agentty 不是一个绑定某个模型的工具而是一个模型无关的终端前端。完整的工具链agentty 内置了一套丰富的工具让 AI 能够真正操作你的代码库文件操作read读取文件、write写入文件、edit编辑文件搜索与导航grep内容搜索、glob文件匹配、find_definition查找定义命令执行bash执行 shell 命令、diagnostics诊断信息Git 集成git_status、git_diff、git_log、git_commit网络能力web_fetch抓取网页、web_search搜索记忆系统remember、forget、wipe_memory任务调度task子代理分发、skill加载 Agent Skill其他todo待办事项、list_dir列出目录每个工具都有专门的 UI widget 来展示结果不是简单的文本输出。比如edit工具会以 diff 的形式展示变更bash工具会展示命令输出和退出码。沙箱安全agentty 默认开启沙箱。在 Linux 上使用bwrapBubblewrap在 macOS 上使用sandbox-exec。这意味着 AI 执行的每一个 shell 命令都跑在隔离环境里文件系统工具也拒绝访问工作区以外的路径。即使你授权了一个bash调用它也无法读取~/.ssh/id_rsa这类敏感文件。权限策略分为三个级别级别读文件系统写文件系统网络执行Write允许允许允许允许Ask允许需确认需确认需确认Minimal需确认需确认需确认需确认这套策略是在编译期通过constexpr验证的48 种组合全部在构建时被穷举检查不存在运行时才发现策略漏洞的可能。离线Air-gapped模式这是 agentty 一个非常有特色的功能。有些开发场景下目标机器是没有外网连接的比如内网服务器、安全隔离环境。agentty 的 airgap 模式允许你在本地笔记本和远程主机之间建立 SSH 隧道本地负责转发 API 请求远程主机上的 agentty 通过 SOCKS5-over-SSH 与本地通信。整个过程中 TLS 证书是端到端 pinned 的中间的 SSH 隧道无法进行中间人攻击。使用非常简单agentty airgap--setupuserhost# 首次复制凭据agentty airgap userhost# 之后每次Agent Skills 与记忆系统agentty 支持通过SKILL.md文件来教 AI 理解你的代码库。你可以在项目的.agentty/skills/目录或全局的~/.agentty/skills/目录下放置技能文件格式兼容 Claude Code 的.claude/skills/。根据项目引用的研究论文arXiv:2410.03981在有内部 DSL 或团队约定的代码库上精心编写的技能文件可以将 AI 的准确率从约 20% 提升到 85%。remember/forget工具则让 AI 能够跨会话记住你的偏好和约定不需要每次重复说明。Zed 集成ACPagentty 支持 Agent Client ProtocolACP可以直接作为 AI agent 跑在 Zed 编辑器里。配置非常简单在 Zed 的settings.json里加一段{agent_servers:{agentty:{command:agentty,args:[acp]}}}这意味着你既可以在终端里直接用 agentty也可以在 Zed 里通过 ACP 调用它两者共享同一套 provider、工具注册表、权限策略和工作区沙箱。代码块运行CtrlG当 AI 回复中包含可执行的 shell 代码块时按CtrlG可以直接在真实终端上运行这些命令——不需要复制粘贴。TUI 会挂起命令在真实 shell 中执行sudo 密码提示可用输出实时显示CtrlC杀掉的是命令而不是 agentty执行完后可以选择将输出附加到对话中、复制到剪贴板或丢弃。解决了什么问题agentty 解决的核心问题可以归结为以下几点第一终端用户的 AI 编程体验问题。现有的 AI 编程助手要么是基于 Electron 的重型应用Cursor、Windsurf要么是 Node.js 的终端工具Claude Code。对于追求轻量、快速、终端原生的开发者来说这些工具的启动时间和资源占用都是痛点。agentty 用 C 编译成单个静态二进制文件冷启动不到 1 毫秒从根本上解决了等工具启动的问题。第二模型锁定的问题。大多数 AI 编程工具深度绑定某个模型提供商。Claude Code 只能用 ClaudeCopilot 只能用 OpenAI。agentty 从架构上就是多模型的用户可以自由切换甚至在离线环境下使用本地 Ollama 模型。这对于有成本考量、隐私需求或单纯想尝试不同模型的用户来说是一个重要的差异化优势。第三离线/内网环境的 AI 编程问题。很多开发场景运维、安全、金融要求目标机器不能直连外网。agentty 的 airgap 模式通过 SSH 隧道优雅地解决了这个问题而且不需要在远程主机上做任何额外配置。第四安全问题。让 AI 在你的代码库上执行命令天然存在安全风险。agentty 通过 OS 级沙箱bwrap/sandbox-exec 编译期验证的权限策略 工作区边界限制构建了一个多层防御体系。这比单纯依赖用户确认要可靠得多。第五AI 对代码库的理解问题。通用大模型对特定项目的内部约定、DSL、架构模式往往理解不够。agentty 的 Agent Skills 机制让开发者可以用自然语言编写技能文件来教AI而且这个能力是跨会话持久的。产品实现分析agentty 的技术实现是它最值得深入分析的部分因为它的设计选择直接决定了产品的体验差异。整体架构Elm 风格的纯函数更新循环agentty 的架构灵感来自 Elm 语言的设计模式整个运行时是一个纯函数循环(Model, Msg) - (Model, CmdMsg)Model是整个应用状态的聚合结构体Msg是一个封闭的 sum typeC 中用std::variant实现包含所有可能的事件Cmd是对副作用的描述网络请求、磁盘操作、定时器由运行时执行后将结果反馈为新的 Msg渲染是第二个纯函数view: Model - Element委托给maya——一个作为 git submodule 引入的姐妹 TUI 引擎。agentty 自身不构造任何 UI 元素只从 Model 状态构建 widget 的 Config 值maya 负责所有像素、边框和动画。这个架构的好处是可预测性极强。状态变化只能通过 Msg 触发副作用只能通过 Cmd 描述没有任何隐式的全局状态修改。这使得调试、测试和推理程序行为变得非常直接。目录结构include/agentty/ ├── domain/ # 纯数据无 I/Osession, conversation, catalog, todo, profile ├── runtime/ # 应用主体model, msg, update, view ├── provider/ # Provider 概念及实现anthropic, openai ├── tool/ # Tool 概念、注册表、权限策略 ├── io/ # http, tls, auth, persistence, clipboard └── airgap/ # SOCKS5-over-SSH src/ # 与 include 镜像的实现文件domain/层只包含纯数据结构没有任何 I/O 操作。session、conversation、catalog、todo、profile都是纯数据。ID 类型使用了强类型 newtypeToolCallId、ThreadId、OAuthCode、PkceVerifier交换两个不同类型的 ID 会在编译期报错而不是在运行时才发现 bug。Provider 抽象层Provider是一个 C26 concepttemplateclassPconceptProviderrequires(Pp,Request req,EventSink sink){{p.stream(std::move(req),std::move(sink))}-std::same_asvoid;};任何能流式传输 chat completion 的类型都满足这个 concept。目前有两个生产级实现AnthropicProviderHTTP/2 SSE支持 OAuth/Pro/Max和OpenAIProvider任何 OpenAI 兼容端点。测试中还有一个确定性的内存脚本实现。main.cpp在启动时通过Depsseam 安装具体的 Provider 和 Store运行时通过app::deps()访问。update_auth()可以在不重启进程的情况下实时切换凭据——进行中的流在请求构建时缓存了 header所以不受影响。Msg 的领域拆分为了避免一个巨大的 variant 导致每次修改都触发全量重编译agentty 将 Msg 拆分成约 12 个领域子变体ComposerMsg、StreamMsg、ToolMsg、ModelPickerMsg等。顶层 reducer 通过std::visit将每个领域转发到独立的翻译单元autostepstd::visit(overload{[](msg::ComposerMsg cm){returndetail::composer_update(...);},[](msg::StreamMsg sm){returndetail::stream_update(...);},[](msg::ToolMsg tm){returndetail::tool_update(...);},// ... 还有 9 个领域分支},msg);这样每个update/domain.cpp只在自己的领域叶子变化时才需要重编译大大提升了开发时的编译速度。工具系统类型安全的 JSON 边界每个工具都实现Toolconcept要求提供静态的身份、schema、效果集和行为templateclassTconceptToolrequires{typenameT::Args;typenameT::Result;{T::name()}-std::convertible_tostd::string_view;{T::description()}-std::convertible_tostd::string_view;{T::input_schema()}-std::convertible_tonlohmann::json;{T::effects()}-std::convertible_toEffectSet;}requires(constnlohmann::jsonargs){{T::execute(args)}-std::convertible_toExecResult;};工具内部是完全类型安全的只有调度器边界才使用 JSON。DynamicDispatch在try/catch中执行工具崩溃的工具变成类型化的ToolError不会导致进程终止并对每个工具应用输出预算防止失控的read/bash/grep撑爆上下文窗口。截断策略有三种Head保留头部适合有序内容read、edit、writeTail保留尾部适合日志流bash、diagnosticsHeadTail保留两端、省略中间适合两端都有信号的工具grep、web、git diff权限策略编译期验证的矩阵每个工具声明一个EffectSet包含四个位ReadFs、WriteFs、Net、Exec。权限策略是一个constexpr函数在编译期被穷举验证4 种效果 × 3 种 Profile 48 个单元格一个独立的expected_decision函数重新表述策略通过static_assert穷举验证每个单元格的一致性。如果任何一方被修改导致不一致构建会直接失败——不是等到测试才发现。工具调度并行安全同样的EffectSet还决定了两个工具是否可以并发执行WriteFs和Exec要求独占访问写操作可能影响其他工具的读取exec 的命令是模型选择的所以必须串行Pure、ReadFs、Net可以自由组合流式转储带重试看门狗的状态机一个 turn 不是单个请求而是一个状态循环Streaming → AwaitingPermission → ExecutingTool → Streaming → ... → Idle。这个 FSM 建模在domain/session.hpp中每个非 Idle 状态都携带 turn 上下文取消令牌、开始时间戳、重试计数器从 Idle 读取这些字段是编译错误。可靠性依赖两个独立机制重试状态机120 秒的停滞看门狗触发取消合成StreamError调度重试两个独立的重试预算truncation_retries处理流中途 EOFtransient_retries处理 5xx/网络/过载/429。后者不是单调递增的——每当连接证明健康第一个内容 delta 或 SSE ping就重置为 0安全边界工作区边界文件系统工具拒绝工作区外的路径--workspace /可以退出沙箱bash和diagnostics默认在 bwrap/sandbox-exec 中运行TLS 证书固定包括通过 airgap SOCKS 隧道的端到端固定原子写入所有持久化文件使用writefsyncrename崩溃不会损坏数据构建与分发语言C26MSVC 上用 C23 /std:clatest编译器要求GCC 14 / Clang 18 / MSVC 14.40构建系统CMake 3.28内存分配器mimallocWindows 上性能提升 15-25%CPU 基线AVX2覆盖 2013 年后的所有桌面/笔记本分发单个完全静态的可执行文件支持 Linux x86_64/aarch64、macOS Intel/Apple Silicon、Windows包管理支持 apt、dnf、zypper、AUR、apk、brew、scoop、winget、nix、snap、gentoo架构逻辑图┌──────────────────────────────────────────────────────────────────┐ │ agentty 运行时 │ │ │ │ ┌──────────┐ ┌──────────────┐ ┌──────────────────────┐ │ │ │ main.cpp │───▶│ Deps Seam │───▶│ Provider Concept │ │ │ │ (启动入口) │ │ (依赖注入) │ │ ├─ Anthropic │ │ │ └──────────┘ └──────────────┘ │ ├─ OpenAI │ │ │ │ │ └─ 测试用内存实现 │ │ │ ▼ └──────────────────────┘ │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ maya TUI 引擎 │ │ │ │ ┌─────────┐ ┌──────────┐ ┌────────────────────────┐ │ │ │ │ │ init │ │ view │ │ subscribe │ │ │ │ │ │(加载状态)│ │(渲染视图) │ │ (定时器 流订阅) │ │ │ │ │ └─────────┘ └──────────┘ └────────────────────────┘ │ │ │ └──────────────────────────────────────────────────────────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ update (Model, Msg) - (Model, Cmd) │ │ │ │ ┌────────────┐ ┌────────────┐ ┌────────────────────┐ │ │ │ │ │ComposerMsg │ │ StreamMsg │ │ ToolMsg │ │ │ │ │ │(输入处理) │ │(流式响应) │ │ (工具调用/结果) │ │ │ │ │ └────────────┘ └────────────┘ └────────────────────┘ │ │ │ │ ... 9 个其他领域 Msg │ │ │ └─────────────────────────────────────────────────────────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌──────────┐ ┌──────────┐ ┌────────────────────────────┐ │ │ │ Store │ │ Tools │ │ 安全层 │ │ │ │(持久化) │ │(注册表) │ │ ├─ 权限策略 (constexpr) │ │ │ │ │ │ │ │ ├─ OS 沙箱 (bwrap) │ │ │ │ │ │ │ │ ├─ 工作区边界 │ │ │ │ │ │ │ │ └─ TLS 证书固定 │ │ │ └──────────┘ └──────────┘ └────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ Airgap (SOCKS5-over-SSH) │ │ │ │ 本地笔记本 ◀═══ SSH 隧道 ═══▶ 远程无网主机 │ │ │ └──────────────────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────────────┘产品优势和同类产品相比agentty 有几个明显的优势极致的启动速度和资源占用。这是 agentty 最直观的优势。一个静态二进制文件冷启动不到 1 毫秒没有 Node 运行时、没有 Python 解释器、没有 npm 依赖。相比之下Claude Code 启动需要加载整个 Node.js 运行时Cursor 和 Windsurf 更是基于 Electron 的重型应用。对于频繁启停终端会话的开发者来说这个差距是体感级别的。真正的多模型自由。大多数 AI 编程工具要么只能用一个模型要么切换模型需要复杂的配置。agentty 从架构上就是模型无关的CtrlP一键切换而且支持本地 Ollama 模型——这意味着你甚至可以在完全离线的环境下使用 AI 编程助手。编译期安全保证。权限策略的 48 种组合在构建时就被穷举验证效果集和并行安全规则通过static_assert锁定。这不是运行时测试能达到的保证级别——如果策略被改坏了构建直接失败不可能带着漏洞发布。离线友好。airgap 模式是 agentty 独有的能力。通过 SSH 隧道让无外网的主机也能使用 AI 编程而且配置简单到只需要一条命令。这对于运维、安全、金融等行业的开发者来说是刚需。终端原生体验。不是把 Web UI 塞进终端而是从零为终端设计的 TUI。maya 引擎处理所有的终端渲染细节——颜色检测、真彩色/256 色/16 色自适应、SSH 环境下的降级策略。代码块运行CtrlG直接在真实终端上执行sudo 密码提示可用CtrlC杀命令不杀 agentty。开放和可替代。MIT 许可证代码完全开放。ACP 协议支持意味着它可以跑在 Zed 里也可以被任何支持 ACP 的编辑器集成。不绑定任何单一供应商。当然agentty 也不是没有取舍。作为一个相对年轻的项目2026 年 4 月创建目前 v0.2.7它的生态和社区规模还无法和 Claude Code 或 Cursor 相比。C26 的编译要求GCC 14 / Clang 18也意味着在某些老旧环境上从源码构建会有门槛——不过预编译的二进制文件覆盖了主流平台。总结agentty 是一个思路清晰、执行到位的产品。它没有试图在所有维度上和 Claude Code、Cursor 这些成熟产品竞争而是精准地切入了一个细分市场追求终端原生体验、注重启动速度和资源占用、需要多模型自由和离线能力的开发者。从技术实现来看agentty 的架构设计值得称赞。Elm 风格的纯函数更新循环带来了极强的可预测性C26 的 concept 和 constexpr 特性被充分利用来在编译期捕获错误领域拆分的 Msg 设计兼顾了类型安全和编译速度。这些不是花哨的技术炫技而是直接转化为用户可感知的体验优势——1 毫秒的启动时间、不会因策略修改引入安全漏洞的权限系统、崩溃不会损坏数据的原子写入。当然作为一个开源项目agentty 的成功最终取决于社区能否围绕它建立起来。但从目前的功能完整度和技术质量来看它已经是一个可以日常使用的产品而不只是一个技术 demo。对于在终端里生活的开发者来说agentty 提供了一个值得认真考虑的选择。参考 URLagentty GitHub 仓库https://github.com/1ay1/agenttyagentty 官网https://agentty.orgagentty 架构文档https://github.com/1ay1/agentty/blob/master/docs/ARCHITECTURE.mdagentty 渲染文档https://github.com/1ay1/agentty/blob/master/docs/RENDERING.mdagentty 代码块运行文档https://github.com/1ay1/agentty/blob/master/docs/RUN_CODE_BLOCK.mdagentty 变更日志https://github.com/1ay1/agentty/blob/master/CHANGELOG.mdmaya TUI 引擎https://github.com/1ay1/mayaAgent Client Protocolhttps://agentclientprotocol.comAgent Skills 相关研究论文https://arxiv.org/abs/2410.03981