把名字改成 Lagoon 之后仅仅过了一个礼拜,我就兑现了当时的想法。因为日常写代码时除了 OpenCode 之外,我用得最多的另一个主力工具就是 DeepSeek Harness(dsh),如果能在一个手机 App 里同时管住这两种工具的会话,出门在外就彻底省心了。
抽象 HarnessClient,无缝接入 dsh web
2026 年 10 月 18 日到 19 日(PR #105 0cdf0ed 至 PR #108 d26b817,v0.3.0-rc.1 至 rc.3),我对 Lagoon 的网络与协议层做了一次解耦,抽出了统一的 HarnessClient 接口,让上层 UI 不再关心底下连的到底是哪家工具。
随后我写了全新的 DshApi 实现,完整对接了 dsh web 所使用的 Typert RPC 网关以及 /api/remote.mux 多路复用 WebSocket 实时流。不管是 DeepSeek Harness 发过来的流式增量文本、工具调用进度,还是需要人工拍板的命令审批与多选问题卡片,全都被严丝合缝地映射进了 Lagoon 同一套深色聊天界面里。在首页的全服务器视图下,OpenCode 服务器和 DSH 服务器的会话肩并肩排在一起,操作手感完全一致。
把签名密钥填进手机,哪怕重启一百次也不用重配对
在对接 dsh web 的认证机制时,我还顺手解决了一个特别烦人的配对痛点。按照 dsh web 的默认设计,每次启动服务时它会在终端打印一条带一次性令牌的启动链接,你必须把这条链接复制粘贴到浏览器或手机里,才能换取长效 Session Cookie。可万一开发机重启了或者服务重开了,手机不在电脑旁边,岂不是当场失联?
我仔细翻了 dsh 的本地认证机制后,在手机端加了一个让我自己直呼过瘾的免配对模式:除了常规粘贴一次性启动链接之外,Lagoon 支持直接把开发机 ~/.dsh/.credentials.yaml 文件里的 browser-session 签名密钥 填进服务器配置。有了这把密钥,手机端直接在本地就能按规范签发出完全合法的认证 Cookie——以后开发机哪怕重启一百次 dsh 服务,手机掏出来照样秒连,永远不用再去电脑前看终端复制链接了。