利益相关声明:作者与文中产品有直接的利益相关(开发者、自家产品等)

我是这个客户端的作者,项目叫 NativeHarness

它做的事一句话说完:把 DeepSeek Harness(下称 DSH)的 Web UI 装进一个原生 macOS 窗口,实现一些没必要通过插件或者需要长期监听的功能,顺便接过插件所解决不了的「装哪个版本、怎么升级、升级坏了怎么办」这一问题

可能有人会说,Github上已经有多个非常成熟的harness的桌面版,他们甚至覆盖的平台更广,能够实现一键包,为什么还自己写?

我是个大一学生,写这个客户端的原因只有希望解决我在使用他们的桌面版时所面临的问题:在用它们的桌面版时,有两个问题一直没被解决——一个是不同版本 harness 的兼容性,另一个是不在同一个局域网里的时候怎么远控

问题一:harness 迭代太快,而桌面端通常只跟最新版

DSH 的版本节奏很快,我一个月里就经历了 0.1.5-rc.1、0.1.5-rc.2、0.1.6-alpha.x 好几次升级,插件的声明又各不相同——有的插件只在某个版本上跑得通。桌面版大多默认「装一个、用最新版」,升出问题,能做的只有重装。

我需要的很朴素:旧版本留着,随时能切回去;换版本之前,先确认新的能用。

所以我把版本管理做成了客户端的一部分:

  • 多版本并存:每个版本自己的目录,列表里随时激活任意一个,不会「升上去就下不来」;
  • 五种来源都能进:npm registry 指定版本(含预发布)、GitHub Release、预构建包、源码归档、源码检出(自动用 pnpm 构建);
  • 装完先验再提交:入口文件在、并且真跑一次 --version,通过了才做原子 rename 提交,不在磁盘上留半个安装。
  • 升级后自检

(控制台里的升级报告:8 项全绿 + 回退按钮)

回退这块我改得最多:只回退一次、不循环(来回横跳比停在旧版本更难查);回退标记先落盘(动之前先写下从哪个版本升上来,崩溃、强退、断电,下次启动接着判);正在当回退目标的版本不允许删除(否则会出现「报告说能退回去,但那个版本已经没了」)。

真起不来的时候还有三层退路:安全模式(用真实 home,但只加载官方 bundle 的 profile,第三方插件全不载入)、干净环境(一次性 home,退出即删)、恢复模式窗口(每次确认监听后记一份声明式配置快照,可预览「哪些文件会变」再还原)。好处是诊断顺序变成可判定的:安全模式能起来 → 插件问题;只有干净环境能起来 → home 层问题;都起不来 → App 侧问题。

问题二:不在同一个局域网,怎么用手机接管

第二个问题更具体。我白天在学校,Mac 放在宿舍;宿舍网没有公网 IP,也做不了端口映射。想在手机上看看某个会话跑到哪了、或者回一句「继续」,用现有方案要么要求手机和电脑在同一张网里,要么得自己配一条隧道。

我的解法是走微信:客户端内置了一个微信通道,扫码绑定之后,链路是手机微信 → 微信服务器 → iLink → 我 Mac 上的客户端 → harness

它省掉了三件事:不需要同一个局域网、不需要公网 IP 或端口映射、不需要自己搭隧道。只要有网、手机上有微信就行。

在微信里能做的事:/list 列会话、/use 接管任意会话(包括我在桌面上新建的)、/history 看历史、/say 续聊、/stop 中断、/answer 回答提问、/workspace切工作区,以及 /model/effort 切模型和思考强度。审批与提问会直接推到微信,回一句「批准」或「拒绝」即可;桌面会话每轮结束时,会把结果(完成 / 上限 / 失败)和这一轮回复的正文一起转发过来。

这里必须说实话:生态里做微信接入的插件至少有八个,我不是第一个,也不是唯一一个。我只是把它做成了 App 里的一个开关——不用自己再装桥接插件,也不用额外配一条通道

 

顺带解决的两件事

原生外壳。外壳是 SwiftUI / AppKit 本身,不是 Web 技术栈的前端加跨平台运行时。这不是审美问题:菜单栏、窗口、通知都是系统行为。官方那边前段时间有一串讨论在报「打包版缺 Edit 菜单,⌘V 没反应」——这类问题在原生外壳上通常不会出现,因为菜单栏是 AppKit 给的,不是自己拼的。顺带,多个窗口是同一个 harness 的多个视图(共享地址、不新起服务),只有主窗口能启停。

插件兼容性。按插件 package.json 里声明的 harness 版本范围逐个比对,给出「兼容 / 超出范围 / 未声明」。我机器上 21 个插件里有 9 个是「未声明」——它不等于不兼容,只是作者没说;但它应该被明确写出来,而不是让人自己猜。

当然现在这个项目仍然存在一些问题:仅 Apple Silicon(仓库里 vendored 的 libzstd 只有 arm64 切片);未公证(自己装没问题,转发给别人会被 Gatekeeper 拦);还没有预构建产物(实在没钱买99刀的会员);只做 macOS,Windows / Linux 请用前面那些更成熟的桌面版。

如果你愿意试,可以访问Github上的项目地址:https://github.com/DanielW203/dsh-native-macos