博客
Tactic Remote 背后的架构:构建分布式编程平台
我们如何设计一个以 Mac 为唯一事实来源的系统,同时让 iPhone 上的每次交互都感觉即时响应。
继续查看该栏目下的产品与工程更新。
浏览此分类构建远程开发平台在纸面上听起来很简单:在一台机器上运行代码,在另一台上显示。但实际工程中,挑战远比想象的深。每一毫秒的延迟都会侵蚀信任。每一次连接中断都可能导致工作丢失。每一个安全上的偷懒都会招来灾难。
本文将详细介绍 Tactic Remote 的架构——我们做出的决策、接受的权衡,以及指导技术方向的原则。
核心问题
开发者越来越依赖 Claude Code 等 AI 辅助编程工具,但这些工具被绑定在桌面终端上。你无法离开工位,否则就会失去对 AI 助手工作情况的掌控。Tactic Remote 正是为了解决这个问题:你的 Mac 仍然是执行引擎,而 iPhone 则成为一流的控制界面。
挑战在于让这一切感觉流畅自然,而不是像笨拙的远程桌面会话。
分层架构
Tactic Remote 由四个独立的层构建而成,每一层都有清晰的职责边界:
第一层:执行引擎(Mac)
基础层是你的 Mac,在 tmux 会话中运行 Claude Code。我们有意选择了 tmux——它提供进程持久化、会话多路复用,以及一个成熟的编程式终端控制接口。Mac 伴侣应用管理 tmux 的生命周期,监控会话健康状态,并为上游消费者暴露一个轻量级 HTTP API。
该层的关键设计决策:
- 进程隔离:每个 Claude Code 会话运行在独立的 tmux 窗口中,防止项目之间的交叉污染。
- 状态持久化:tmux 会话能够在应用重启、网络中断甚至系统休眠周期中存活。
- 最小资源占用:伴侣应用在空闲时几乎不增加 CPU 和内存开销。
第二层:传输层
Mac 和 iPhone 之间是传输层——可以是直接的局域网连接,也可以是通过 Cloudflare Tunnel 的远程访问。
本地模式使用 mDNS/Bonjour 进行设备发现,使用直接 HTTP 进行数据传输。在良好的网络环境下,往返时延低于 10ms,终端流式传输几乎感觉不到延迟。
Cloudflare Tunnel 模式通过 Cloudflare 的边缘网络路由流量。这会增加延迟(通常 30-80ms),但可以从任何地方访问——咖啡店、通勤列车,或地球的另一端。我们在 Mac 端使用 Cloudflare 的 cloudflared 守护进程,它建立的是仅出站连接,这意味着无需在防火墙上开放任何端口。
第三层:会话管理器
会话管理器是整个系统的大脑。它运行在 Mac 上,维护活跃 tmux 会话的注册表,跟踪它们的状态(空闲、运行中、等待输入),并处理重连的复杂编排。
当你的 iPhone 在网络中断后重新连接时,会话管理器必须在毫秒级别回答以下问题:
- 断开连接前哪些会话处于活跃状态?
- 中断期间是否有终端输出积累?
- 是否有会话正在等待用户批准敏感操作?
- 每个 Claude Code 实例的当前进程状态是什么?
我们通过事件溯源(将状态转换记录为不可变事件)和快照缓存(定期捕获终端缓冲区状态以实现快速恢复)的组合来解决这个问题。
第四层:移动端界面
iPhone 应用不是一个终端模拟器——这是我们刻意为之。我们在早期就做出了决定:把完整的终端塞进手机屏幕会带来糟糕的用户体验。取而代之的是,移动端提供:
- 对话视图:以可读的格式查看 Claude 的推理过程和输出。
- 终端预览:需要时快速查看原始终端输出。
- 审批控制:一键批准/拒绝需要人工确认的操作。
- 通知桥接:任务完成和审批请求的推送通知。
韧性模式
现实世界的网络是不可靠的。手机在电梯里会失去信号。Wi-Fi 在你走动时会断开。我们的韧性策略建立在三个原则之上:
假设断连是常态。 每个组件都被设计为在网络分区期间能独立运作。Mac 继续执行。iPhone 缓存最后已知的状态。重连触发的是状态协调协议,而不是完全重启。
永不丢失工作。 终端输出在 Mac 端进行缓冲,保留时间可配置。即使你的 iPhone 离线一小时,重新连接后也能看到期间发生的一切。
可见地失败。 当出现问题时,用户看到的是诚实的错误信息,而不是一个永远转不完的加载动画。我们在连接状态指示器上投入了大量精力,确保它在几秒内反映真实情况。
安全设计
远程运行 AI 生成的代码会引发严肃的安全问题。我们的安全模型在安全模型文档中有详细介绍,架构层面的要点包括:
- 零信任传输:所有通信都经过加密,无论是本地通信(TLS)还是隧道通信(Cloudflare 的加密层)。
- 审批关卡:敏感操作(文件写入、Shell 命令、网络访问)在执行前需要移动端的明确批准。
- 无云端依赖:你的代码永远不会离开你的 Mac。Tactic Remote 是控制平面,而非数据平面。
下一步计划
架构永远不会完结。我们正在积极开发多 Mac 支持(一部 iPhone 连接多台开发机器)、协作会话(多个团队成员监控同一个 Claude Code 运行实例),以及更深层的 IDE 集成。这些功能都需要在不损害已有可靠性的前提下扩展架构。
如果你正在构建分布式开发者工具,希望这篇概述对你有所帮助。如果你想亲身体验这套架构,从这里开始。