前言¶
DeepSeek Harness(DSH)启动时会为当前进程生成一次性的 launch token,浏览器只有通过 GET /?token=… 才能换取绑定 authority 的会话 cookie;/api 与 WebSocket 都依赖这份 cookie。命令行里通常会打印一行带 token 的地址,但桌面版 Harness 监听在回环地址上,手机在同一局域网里往往既看不到这行输出,也连不上 127.0.0.1。宿主插件与 Connection 服务同进程,可以拿到已认证的 URL,却仍需解决「链接落盘」和「非本机设备如何连上」两件事。下面介绍社区插件 dsh-lan-link(维护者 sqzw-x),它把带 token 的启动链接写入 Harness 主目录,并可选地在进程内起一个固定端口的局域网网关,让手机在可信网段内无需再粘 token。
这是什么¶
dsh-lan-link 是 DSH 的 admin-security 类插件,当前在 SkillHub 目录 与 GitHub 发布(MIT 许可证,package 版本 0.2.1)。它只服务当前这一个 harness 进程:一条路径是把各网卡 IPv4 对应的、带 launch token 的链接写到磁盘并注册环境变量;另一条路径(可选)是在同一 Node 进程里监听局域网端口,代持本机会话并把请求转发到回环上的 Harness,从而绕过桌面版「只绑回环、拒绝 0.0.0.0」的限制。
两种链接怎么选¶
README 用表格区分两种用法,落地时先想清楚设备侧要承担什么、重启后谁负责续期。
| token 链接 | 网关(gateway.enabled) |
|
|---|---|---|
| 设备需要什么 | 打开一次带 ?token=… 的链接 |
直接打开网关 URL,无需 token |
| 谁能用 | 能到达 Harness 监听地址的客户端 | 源 IP 在 allowCidrs 内(或本机) |
| 端口 | Harness 自身端口(桌面版多为回环,手机通常不可达) | 网关固定端口(如 3081) |
| 会话凭据 | 落在手机(cookie,默认 30 天) | 留在本机(网关代持) |
| Harness 重启后 | 端口变化则旧链接失效 | 网关启动时自动重新换取,设备无感 |
只做「把链接记下来、本机浏览器或能直连 LAN 地址的环境用 token 登录」,可以只依赖落盘文件;要在手机上稳定打开完整主机界面且不想每次粘 token,需要打开网关。
核心功能¶
落盘链接与环境变量¶
Web server 绑定后,插件把每个本机 IPv4 的 launch 链接写入 <harness home>/lan-link.txt(示例路径 ~/.dsh/lan-link.txt,权限 0600),并把 DSH_LAN_LINK 注册进 shell 环境。文件在每次 Harness 启动时覆盖;端口、网卡或网关状态变化时会重写。有网关时,DSH_LAN_LINK 优先指向网关 URL。
文件内容大致包括:网关说明行、各网卡下的 token 链接,以及本机回环用的 127.0.0.1 链接。token 本身不落盘,文件中的是换会话用的启动 URL。
进程内局域网网关¶
gateway.enabled: true 时,插件在同一进程内再起一个监听(默认 0.0.0.0:3081),在网关侧终结连接,再以「本机浏览器」身份向回环转发:
- 代持会话:通过
connection.authenticatedUrl()在回环换取浏览器会话 cookie,转发请求代设备出示;Harness 拒绝时自动重换。 - 重写 Host/Origin:使请求通过 Harness
/api同源校验,行为与本机访问一致。 - HTML 注入:对文档注入
crypto.randomUUID补丁(明文 HTTP 非安全上下文时浏览器会禁用该 API),以及桌面壳用于声明「主机」的标记;injectHostClaim: true时按完整主机界面渲染,否则保持远程访客降级。非 HTML 响应尽量逐字节透传,大体积 bundle 不重压缩。
Harness 仍可用 --port 0 随机端口;固定的是网关端口。启动时若开启 verifySeam: true,会探测 host-claim 注入是否仍有效并告警。
安装与启用¶
插件以当前 DSH 进程权限运行,安装前建议在 GitHub 查看源码与 MIT 许可证,并确认本机 DSH 版本满足 engines 要求(Node >=22.18,DSH 见 package.json 中的范围)。
插件管理器¶
在「设置 → 插件」中安装 dsh-lan-link,启用后按提示重启。桌面版与 Web 版均适用。
命令行¶
# 从 npm
dsh plugin --profile <profile> add dsh-lan-link
# 从 GitHub
dsh plugin --profile <profile> add github:sqzw-x/dsh-lan-link
desktop profile(Electron)¶
desktop profile 由 Electron 应用独占管理,不能使用 dsh plugin --profile desktop …(会被拒绝)。需在 profile 目录直接改依赖,例如:
// ~/.dsh/profiles/desktop/package.json
"dependencies": { "dsh-lan-link": "^0.2.0" },
"dsh": { "profile": { "bundles": [ …, "dsh-lan-link" ] } }
在 profile 目录执行 pnpm install(或通过应用内插件管理器),重启应用。开发时可将依赖改为 link:/path/to/dsh-lan-link。
停用:配置里 - id: lan-link 并设 disabled: true(网关一并关闭);仅关对外网关则设 gateway.enabled: false。
配置示例¶
在 profile 的插件配置中增加(字段以 README 为准):
- id: lan-link
name: 'dsh-lan-link'
config:
fileName: 'lan-link.txt'
intervalMs: 1000
gateway:
enabled: true
listenHost: '0.0.0.0' # 绑哪个网卡;0.0.0.0 = 全部
listenPort: 3081 # 设备访问的端口;0 = 让系统挑
allowCidrs: # 除本机回环外允许的客户端
- '192.168.0.0/24' # 只写你自己拥有的网段
allowLoopback: true # 是否允许本机访问(默认 true)
username: '' # 可选 Basic Auth,两者都非空才生效
password: ''
injectHostClaim: true # 完整主机界面;false = 保持"远程访客"降级
verifySeam: true # 启动时探测 host-claim 缝隙是否仍在
listenHost 与 allowCidrs 是网关访问控制的主防线;Basic Auth 在明文 HTTP 上只能作补充。
典型用法与验证¶
启动 Harness 并启用插件后,先读落盘文件确认链接是否更新:
cat ~/.dsh/lan-link.txt
若已开网关,在同一局域网设备上应能无 token 访问(将 IP 换成你文件中的地址):
curl -s -o /dev/null -w '%{http_code}\n' http://192.168.0.2:3081/ # 期望 200,无需 token
新 shell 中可检查环境变量(有网关时一般为网关 URL):
echo "$DSH_LAN_LINK"
在当前 Harness 正在运行的前提下,仓库提供端到端冒烟(需在插件源码目录执行):
node scripts/live-smoke.mjs # 读 ~/.dsh/lan-link.txt 里的 token
node scripts/live-smoke.mjs --port 3081 --host 192.168.0.2
脚本会检查匿名访问 200、脚本注入、客户端 bundle 与直连一致性、host-claim 探测,以及 /api/remote.mux 的 WebSocket 升级。
适用场景与注意¶
适合:自家或可控局域网里,用手机或平板打开当前这台机器上的 Harness;桌面版需要固定网关端口、不想依赖 stdout 里的 launch 行;希望 token 链接集中写在 lan-link.txt 供脚本或 DSH_LAN_LINK 使用。
不适合:把 Harness 等价于 shell 的能力暴露到不可信网络。Harness 故意不支持 --host 0.0.0.0;打开网关等于在本机自愿增加一层转发,日志里来源会显示为本机。token 链接换得的会话可触达具备工具能力的 API,宿主端没有按设备撤销;吊销需删 .credentials.yaml 中 client-connection/browser-session 并重启,会踢掉所有设备。需要「人在外网」访问时,应使用 Harness 的配对/隧道类方案,而不是本插件网关。
回滚:从 profile 的 dsh.profile.bundles 与 dependencies 移除 dsh-lan-link 后重启;或仅设 gateway.enabled: false 保留落盘行为。
结尾¶
dsh-lan-link 把「当前进程的认证启动链接」落到 lan-link.txt 与 DSH_LAN_LINK,并在可选网关下用固定 LAN 端口、本机会话代持,解决桌面 Harness 回环监听与 launch token 难观测的问题。目录与源码: