高铁抢票互助
70.26M · 2026-04-12
最近发现一个有趣的开源项目 lunel ,用户可以通过手机连接上电脑,然后直接运行 Codex、OpenCode、Claude Code ,重要的是免费和公网可用。
它的核心技术原理其实是「手机作为纯 UI 客户端 」,然后本地机器通过 WebSocket 网关实现中继连接,然后电脑 CLI 通过服务和 AI 终端交互,项目主要分三部分:
Expo + React Native 开发的 Android 和 iOS App :
CLI 工具,就是电脑上跑的 lunel-cli ,负责所有真实操作:
中继服务器,用 Bun 写的 WebSocket 网关(公开部署在 gateway.lunel.dev / two.lunel.dev)
另外目前有两种模式:
这里面一个核心之一是 “中继转发(Relay)” ,Lunel 包含了一个名为 Proxy 的 Bun 服务端,作为移动端 App 和本地 CLI 之间的 WebSocket 桥梁,App 只做 ch@t 和审,逻辑和执行都在电脑的 Lunel CLI 。
CLI 会调用一个 Rust 写的 pty 二进制文件, pty 是基于 wezterm 开发,当你在手机 App 的终端或 AI 聊天输入内容时,App 不会直接发送原始文本,而是会封装为标准化的 Message 对象:
pty 代表终端操作,ai 代表 AI 指令)input 或 ask本地 CLI 接收到消息后,会根据 ns 将输入分发到不同的执行器:
如果 ns 为终端相关的空间,CLI 会将 payload 中的字符通过 stdin(标准输入)写入 Rust PTY 进程,就类似你在电脑键盘上打字一样,本地的 Bash 或 Zsh 接收到字符执行。
如果输入来自 AI 面板,CLI 会转给 AI 代理模块(如 cli/src/ai/opencode.ts):
而对于调用上,不同 AI 终端还不一样,例如对于 OpenCode,Lunel CLI 不是直接运行外部命令,而是利用 SDK 在本地进程做管理:
@opencode-ai/sdk 中的 createOpencodeServer,在本地随机端口启动一个 OpenCode 服务器Authorization 请求头与该本地服务器通信server.heartbeat 或 session.updated),并将其转发给手机端 App而对于 Codex 的调用方式是 JSON-RPC ,它的交互相对复杂一些:
spawn("codex", ["app-server"], ...) 在后台启动一个 codex 进程,这个进程对用户是不可见prompt 指令,CLI 会转化为 turn/start 的 JSON 请求发送给后台进程基于这个流程, Lunel CLI 可以在过程中精准识别和控制整个过程,例如当 AI 尝试执行危险命令或修改敏感文件时,CLI 可以捕获到 requestApproval 请求,并暂停执行,直到你在手机上点击“批准” 。
另外 Lunel Cloud 模式还没完成,它的目标看起来是,在你需要的时候,直接通过 GitHub OAuth 登录,然后直接就可以在云端 VM 拉起一个服务,然后运行预装了 Lunel 的 VM ,这个看起来也挺有意思,也可以期待下。
这个项目的思路还是挺好的,比如通过手机你就可以直接坚控和管理你的 Codex 或者 Claude Code ,当然 Claude Code 本身也支持 mobile 远程命令,但是这个支持多个不同的 CLI 场景,更灵活,功能也更多,目前还是免费,重点是开源,自己弄一套感觉比龙虾有意思多了。
github.com/lunel-dev/l…