2024年顶级AI编程工具测评:手机运行Codex实战指南
最近发现一个挺有意思的开源项目,叫 Lunel。简单来说,它能让你用手机连上电脑,然后直接在手机上运行 Codex、OpenCode、Claude Code 这类 AI 编程工具。最关键的是,它目前免费,而且支持公网访问。
这个项目的核心思路其实很清晰:把手机当作一个纯粹的 UI 客户端。真正的计算和操作,都发生在你的本地电脑上。为了实现手机和电脑之间的远程连接,它引入了一个 WebSocket 网关作为中继。整个架构主要分为三块:
移动端 App:基于 Expo + React Native 开发,支持 Android 和 iOS。
- 功能上,它集成了 AI 面板(如 Codex、OpenCode 等)。
- 同时,也支持基础的 Git 操作、终端模拟器以及文件浏览和编辑。
本地 CLI 工具:也就是在你电脑上运行的
lunel-cli,所有“脏活累活”都由它负责。- 包括文件的读写、grep 搜索。
- 执行 Git 命令。
- 运行终端(PTY)。这里用 Rust 写了一个伪终端,基于 wezterm 内核,为了节省流量,它每帧只发送屏幕上发生变化的字符网格(cell grid)和颜色信息。
- 此外,还负责进程管理、端口扫描和系统监控(CPU/内存/磁盘)。
中继服务器:一个用 Bun 写的 WebSocket 网关,目前公开部署在 gateway.lunel.dev 和 two.lunel.dev。
- 采用双通道架构(控制通道 + 数据通道)。
- 使用二维码(QR 码)进行设备配对,流程比较直观。
目前,Lunel 提供了两种使用模式:
- Lunel Connect:连接到你本地的电脑,并且支持通过公网访问。
- Lunel Cloud:通过 GitHub 登录后,直接为你开启一个云虚拟机(VM)。这个模式目前还在开发中,尚未正式完成。
整个系统的关键之一在于“中继转发(Relay)”。Lunel 包含了一个名为 Proxy 的 Bun 服务端,它充当了移动端 App 和本地 CLI 之间的 WebSocket 桥梁。这样一来,App 只负责聊天界面和审批操作,而所有的业务逻辑和命令执行,都交给了电脑上的 Lunel CLI。
具体到执行层面,CLI 会调用一个用 Rust 写的 pty 二进制文件(基于 wezterm 开发)。当你在手机 App 的终端或 AI 聊天框里输入内容时,App 并不会直接发送原始文本,而是会将其封装成一个标准化的 Message 对象,包含:
- 命名空间 (ns):用来区分消息的用途,比如
pty代表终端操作,ai代表 AI 指令。 - action:具体的操作类型,例如
input(输入)或ask(询问)。 - payload:里面装着你输入的实际文字内容。
本地 CLI 收到这个消息后,会根据 ns 字段,将输入分发给不同的执行器去处理。
普通终端输入 (PTY 模式)
如果 ns 是终端相关的,CLI 就会把 payload 里的字符,通过标准输入(stdin)写入到 Rust PTY 进程中。这个过程,就跟你坐在电脑前敲键盘一模一样,本地的 Bash 或 Zsh 会接收到这些字符并执行。
AI 指令输入 (Claude Code / OpenCode)
如果输入来自 AI 面板,CLI 则会转交给对应的 AI 袋里模块(比如 cli/src/ai/opencode.ts)来处理。这个过程通常分几步:
- 上下文搜集:CLI 会自动收集当前的上下文信息,比如文件结构、终端最后几行的输出内容等。
- API 调用:CLI 使用你预先配置好的 API Key(例如 Anthropic 或 OpenAI 的),将“用户输入 + 系统上下文”打包发送给对应的 AI 模型。
- 工具调用:如果 AI 返回的指令里包含了“修改文件”或“运行命令”这样的操作,CLI 的 AI 模块会解析这些指令,并调用本地的文件系统接口或 PTY 接口去真实地执行它。
值得注意的是,对于不同的 AI 终端,Lunel CLI 的调用方式也有所不同。
以 OpenCode 为例,CLI 并非直接运行外部命令,而是利用其 SDK 在本地进程中进行管理:
- CLI 会调用
@opencode-ai/sdk中的createOpencodeServer函数,在本地一个随机端口上启动一个 OpenCode 服务器。 - 同时,它会创建一个 API 客户端,通过
Authorization请求头与这个本地服务器通信。 - 通信方式上,它通过 SSE(Server-Sent Events)循环监听 AI 返回的事件(比如
server.heartbeat或session.updated),并将其转发给手机端的 App。
而对于 Codex,交互方式则换成了 JSON-RPC,相对复杂一些:
- 静默启动后台进程:CLI 会通过
spawn(“codex”, [“app-server”], …)的方式,在后台启动一个codex进程,这个进程对用户是不可见的。 - 标准流通信:它不依赖网络端口,而是直接通过进程的标准输入(stdin)和标准输出(stdout)进行对话。
- JSON-RPC 2.0 协议:两者之间通过 JSON-RPC 2.0 协议交换结构化的数据。例如,App 发送一个
prompt指令,CLI 会将其转化为turn/start这样的 JSON 请求发送给后台进程。
正是基于这样精细的流程控制,Lunel CLI 能够在整个过程中进行精准的识别和干预。比如,当 AI 试图执行一个危险命令或修改敏感文件时,CLI 可以捕获到 requestApproval 请求,然后暂停执行,直到你在手机上点击“批准”按钮才会继续。这相当于增加了一层安全护栏。
另外,前面提到的 Lunel Cloud 模式虽然还没完工,但目标很明确:在你需要的时候,直接通过 GitHub OAuth 登录,系统就会在云端为你拉起一个预装了 Lunel 的虚拟机(VM)。这个想法听起来也挺有意思,值得保持关注。
总体来看,这个项目的思路确实不错。它让你能通过手机这个最随身设备,来直接监控和管理 Codex 或 Claude Code 等工具。当然,像 Claude Code 本身也支持移动端远程命令,但 Lunel 的优势在于它能统一支持多个不同的 CLI 场景,更加灵活,功能也更集中。目前它还是免费开源的,自己折腾一套下来,感觉比用一些现成的封闭方案更有趣,也更有掌控感。
链接
github.com/lunel-dev/l…
