平时让 AI 编码工具在开发机上干活时,我经常遇到一个特别尴尬的场景:给它派了一个重构或者修 Bug 的长任务,它要在那儿读文件、跑测试折腾好几分钟。这时候我如果离开电脑桌去倒杯水,或者干脆躺到沙发和床上休息,心里就一直悬着——不知道它到底是已经顺利跑完了,还是正卡在某个 bash 命令的权限审批弹窗上干等着我点“允许”。
为了能随时掏出手机瞄一眼进度、顺手点个审批或者追发一句指令,我在 2026 年 9 月 27 日(Commit e703102、56d4887)立项了原生 Android 移动控制端 OpenCode Lagoon(初版 v0.1.0-rc.1)。
走弯路的初版:每台机器都要装一遍伴随服务?
在设计 v0.1.0 的时候,我把架构想得太复杂了。当时为了能在手机锁屏后收到任务完成或权限审批的推送,我专门用 Node.js 写了一个叫 companion 的伴随服务端,还配了一个 OpenCode 推送插件,要求部署在开发机上监听事件,再通过 Google Firebase(FCM)把通知推回手机。
结果自己往第二台、第三台开发机上接的时候,立马觉得这套方案蠢透了:我明明只是想用手机连一下开发机,凭什么每加一台机器都得去装 Node 环境、配一遍伴随服务、折腾一回 FCM 密钥和海外推送网络?
v0.2.0 大刀阔斧做减法:纯手机端直连 SSE 流
想明白这一点后,我在 10 月 3 日发布 v0.2.0(PR #47,Commit 0012059)时做了一次毫不留情的大减法:直接把仓库里的 companion 伴随服务端、推送插件以及客户端的 Firebase 依赖删了个精光。
取而代之的,是在 Android 客户端里写了一个低功耗前台常驻服务(TaskMonitorService),让手机直接连上开发机 OpenCode 原生自带的 SSE 实时事件流,在手机本地解析状态并弹出系统通知。这么一改,开发机那边真正做到了零插件、零额外进程、零配置改造——手机上填个地址和端口,当场就能连上去看会话、批权限。